Tarango

2-D Bit

Oct 23rd, 2015
247
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.50 KB | None | 0 0
  1. //============================================================================
  2. // Name        : 2-D BIT
  3. // Author      : Tarango Khan
  4. // Team        : BRACU Byteheads
  5. //============================================================================
  6.  
  7. #include <bits/stdc++.h>
  8. using namespace std;
  9. #define Size 1025
  10. int maxX = 1025;
  11. int maxY = 1025;
  12.  
  13. int n;
  14. int A[Size][Size];
  15. int tree[Size][Size];
  16.  
  17. int query(int x, int y) {
  18.     int sum = 0;
  19.     while (x > 0) {
  20.         int y1 = y;
  21.         while (y1 > 0) {
  22.             sum += tree[x][y1];
  23.             y1 -= (y1 & -y1);
  24.         }
  25.         x -= (x & -x);
  26.     }
  27.     return sum;
  28. }
  29.  
  30. void update(int x, int y, int val) {
  31.     while (x <= maxX) {
  32.         int y1 = y;
  33.         while (y1 <= maxY) {
  34.             tree[x][y1] += val;
  35.             y1 += (y1 & -y1);
  36.         }
  37.         x += (x & -x);
  38.     }
  39. }
  40.  
  41. int getRes(int x1, int y1, int x2, int y2) {
  42.     return query(x2, y2) - query(x2, y1 - 1) - query(x1 - 1, y2) + query(x1 - 1, y1 - 1);
  43. }
  44.  
  45. char t[4];
  46.  
  47. int main() {
  48.     int nCase,x,y,val;
  49.     int x1, y1, x2, y2;
  50.  
  51.     scanf("%d", &nCase);
  52.     for (int cs = 1; cs <= nCase; cs++) {
  53.         scanf("%d", &n);
  54.         memset(tree, 0, sizeof tree);
  55.         memset(A, 0, sizeof A);
  56.         while(scanf("%s",t) == 1){
  57.             if(t[0] == 'E') break;
  58.             if (t[1] == 'E') {
  59.                 scanf("%d %d %d", &x, &y ,&val);
  60.                 x++, y++;
  61.                 int prev = A[x][y];
  62.                 int nVal = val-prev;
  63.                 A[x][y] = val;
  64.                 update(x, y, nVal);
  65.             } else {
  66.                 scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
  67.                 x1++, y1++, x2++, y2++;
  68.                 int res = getRes(x1, y1, x2, y2);
  69.                 printf("%d\n", res);
  70.             }
  71.         }
  72.     }
  73.     return 0;
  74. }
Advertisement
Add Comment
Please, Sign In to add comment