Advertisement
royalsflush

NKMOBILE com Segtree II (0)

Sep 7th, 2012
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.88 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. int tree[10*1024+10][10*1024+10];
  7. int s,ins;
  8.  
  9. void update(int rootX, int rootY, int l, int r, int b, int t,
  10.     int x, int y, int val) {
  11.  
  12.     if (l==r && b==t) {
  13.         tree[rootX][rootY]+=val;
  14.         return;
  15.     }
  16.  
  17.     int midX = (l+r)/2, midY=(t+b)/2;
  18.  
  19.     if (x<=midX) {
  20.         if (y<=midY) update(2*rootX+1, 2*rootY+1,l,midX,b,midY,x,y,val);
  21.         else update(2*rootX+1, 2*rootY+2,l,midX,midY+1,t,x,y,val); 
  22.     }
  23.     else {
  24.         if (y<=midY) update(2*rootX+2, 2*rootY+1,midX+1,r,b,midY,x,y,val);
  25.         else update(2*rootX+2, 2*rootY+2,midX+1,r,midY+1,t,x,y,val);   
  26.     }  
  27.  
  28.     tree[rootX][rootY]=tree[2*rootX+1][2*rootY+1]+tree[2*rootX+1][2*rootY+2]+
  29.         tree[2*rootX+2][2*rootY+1]+tree[2*rootX+2][2*rootY+2]; 
  30. }
  31.  
  32. int queryY(int rx, int ry, int b, int t, int qb, int qt) {
  33.     if (qb<=b && qt>=t)
  34.         return tree[rx][ry];
  35.  
  36.     int mid=(t+b)/2;
  37.     int sum=0;
  38.  
  39.     if (qb<=mid) sum+=queryY(rx,2*ry+1,b,mid,qb,min(mid,qt));
  40.     if (qt>mid) sum+=queryY(rx,2*ry+2,mid+1,t,max(qb,mid+1),qt);
  41.  
  42.     return sum;
  43. }
  44.  
  45. int query(int rx, int ry, int l, int r, int b, int t,
  46.     int ql, int qr, int qb, int qt) {
  47.  
  48.     if (ql<=l && qr>=r)
  49.         return queryY(rx,ry,b,t,qb,qt);
  50.  
  51.     int mid=(l+r)/2;
  52.     int sum=0;
  53.  
  54.     if (ql<=mid) sum+=query(2*rx+1,ry,l,mid,b,t,ql,min(qr,mid),qb,qt);
  55.     if (qr>mid) sum+=query(2*rx+2,ry,mid+1,r,b,t,max(ql,mid+1),qr,qb,qt);
  56.  
  57.     return sum;
  58. }
  59.  
  60. int main() {
  61.     while (1) {
  62.         scanf("%d", &ins);
  63.        
  64.         switch(ins) {
  65.             case 3:
  66.                 return 0;
  67.             case 0:
  68.                 scanf("%d", &s);
  69.                 memset(tree,0,sizeof(tree));
  70.                 break;
  71.             case 1: {
  72.                 int x,y,a;
  73.                 scanf("%d %d %d", &x,&y,&a);
  74.                 x--, y--;
  75.                 update(0,0,0,s-1,0,s-1,x,y,a);
  76.                 break;
  77.             }
  78.             case 2: {
  79.                 int l,r,b,t;
  80.                 scanf("%d %d %d %d", &l,&b,&r,&t);
  81.                 l--, b--, r--, t--;
  82.                 printf("%d\n", query(0,0,0,s-1,0,s-1,
  83.                     l,r,b,t));
  84.                 break;
  85.             }
  86.         }
  87.     }
  88.  
  89.     return 0;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement