Advertisement
RaFiN_

2D BIT

Jun 6th, 2020
822
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.28 KB | None | 0 0
  1. //2D BIT
  2. // in update function indx can't start from 0
  3. int n; ll tree[1025][1025];char str[5];
  4.  
  5. void update(int x,int y,ll val){
  6.     for(int i = x;i<=n;i+=(i&-i)){
  7.         for(int j = y;j<=n;j+=(j&-j)){
  8.             tree[i][j] += val;
  9.         }
  10.     }
  11. }
  12.  
  13. ll query(int x,int y){
  14.     ll sum = 0;
  15.     for(int i = x;i>0;i-=(i&-i)){
  16.         for(int j = y;j>0;j-=(j&-j)){
  17.             sum += tree[i][j];
  18.         }
  19.     }
  20.     return sum;
  21. }
  22.  
  23. int main()
  24. {
  25.     booster()
  26.     //read("input.txt");
  27.     int t;
  28.     scani(t);
  29.     while(t--){
  30.         scani(n);
  31.         for(int i = 0;i<=n;i++){
  32.             for(int j = 0;j<=n;j++)tree[i][j] = 0;
  33.         }
  34.         string s;
  35.         while(1){
  36.             scanf("%s",str);
  37.             string s = str;
  38.             if(s=="END")break;
  39.             if(s=="SET"){
  40.                 int uu,vv,val;
  41.                 scani3(uu,vv,val);
  42.                 uu ++;
  43.                 vv ++;
  44.                 ll pp = query(uu,vv) - query(uu-1,vv) - query(uu,vv-1) + query(uu-1,vv-1);
  45.                 update(uu,vv,val-pp);
  46.             }
  47.             else {
  48.                 int a,b,c,d;
  49.                 scani4(a,b,c,d);
  50.                 a ++;b ++;c ++;d ++;
  51.                 printf("%lld\n",query(c,d) - query(a-1,d) - query(c,b-1) + query(a-1,b-1));
  52.             }
  53.         }
  54.     }
  55.  
  56.     return 0;
  57. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement