bhupixb

Sqrt decomposition

Jul 1st, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.42 KB | None | 0 0
  1. // Bhupendra Yadav
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. const int N = 1001;
  5. int blk_size, sqr[N], arr[N * N];
  6.  
  7. void upd(int index, int val){
  8. int i = index / blk_size + (index % blk_size != 0);
  9. sqr[i] += val - arr[index];
  10. arr[index] = val;
  11. }
  12.  
  13. int ans(int l, int r){
  14. int x = l / blk_size;
  15. if(l % blk_size)x++;
  16. x *= blk_size;
  17. int32_t sum = 0;
  18. // cout << x << ' ' ;
  19.  
  20.  
  21. while(l <= min(x,r))sum += arr[l++];
  22. if(l > r)return sum;
  23. x /= blk_size;
  24. x++;
  25. int y = r / blk_size;
  26. // cout << "sum = " << sum << ' ' ;
  27. if(r % blk_size == 0)y--;
  28. // cout << x << ' ' << y << endl;
  29. while(x <= y)sum += sqr[x],x++;
  30.  
  31. y = y * blk_size + 1;
  32. while(y <= r)sum += arr[y], y++;
  33.  
  34. return sum;
  35.  
  36. }
  37.  
  38. int main(){
  39. int n, m, i;long int sum = 0;
  40. cin >> n >> m;
  41. for(int i = 1; i <= n; i++)
  42. cin >> arr[i];
  43. blk_size = sqrt(n);
  44. if(blk_size * blk_size != n)blk_size ++;
  45.  
  46. cout << blk_size << endl;
  47. // precompute
  48. for(i = 1; i <= n; i++){
  49. sum += arr[i];
  50. if(i % blk_size == 0)
  51. sqr[i / blk_size] = sum,sum = 0;;
  52.  
  53. }
  54. for(int i = 0; i < m; i++){
  55. int c, l , r;
  56. cin >> c;
  57. if(c == 1){
  58. cin >> l >> r;
  59. cout << ans(l, r) << endl;
  60. }
  61. else {
  62. int index, val;
  63. cin >> index >> val;
  64. upd(index, val);
  65. }
  66. }
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76.  
  77.  
  78. }
Add Comment
Please, Sign In to add comment