Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <algorithm>
- using namespace std;
- int tree[10*1024+10][10*1024+10];
- int s,ins;
- void update(int rootX, int rootY, int l, int r, int b, int t,
- int x, int y, int val) {
- if (l==r && b==t) {
- tree[rootX][rootY]+=val;
- return;
- }
- int midX = (l+r)/2, midY=(t+b)/2;
- if (x<=midX) {
- if (y<=midY) update(2*rootX+1, 2*rootY+1,l,midX,b,midY,x,y,val);
- else update(2*rootX+1, 2*rootY+2,l,midX,midY+1,t,x,y,val);
- }
- else {
- if (y<=midY) update(2*rootX+2, 2*rootY+1,midX+1,r,b,midY,x,y,val);
- else update(2*rootX+2, 2*rootY+2,midX+1,r,midY+1,t,x,y,val);
- }
- tree[rootX][rootY]=tree[2*rootX+1][2*rootY+1]+tree[2*rootX+1][2*rootY+2]+
- tree[2*rootX+2][2*rootY+1]+tree[2*rootX+2][2*rootY+2];
- }
- int queryY(int rx, int ry, int b, int t, int qb, int qt) {
- if (qb<=b && qt>=t)
- return tree[rx][ry];
- int mid=(t+b)/2;
- int sum=0;
- if (qb<=mid) sum+=queryY(rx,2*ry+1,b,mid,qb,min(mid,qt));
- if (qt>mid) sum+=queryY(rx,2*ry+2,mid+1,t,max(qb,mid+1),qt);
- return sum;
- }
- int query(int rx, int ry, int l, int r, int b, int t,
- int ql, int qr, int qb, int qt) {
- if (ql<=l && qr>=r)
- return queryY(rx,ry,b,t,qb,qt);
- int mid=(l+r)/2;
- int sum=0;
- if (ql<=mid) sum+=query(2*rx+1,ry,l,mid,b,t,ql,min(qr,mid),qb,qt);
- if (qr>mid) sum+=query(2*rx+2,ry,mid+1,r,b,t,max(ql,mid+1),qr,qb,qt);
- return sum;
- }
- int main() {
- while (1) {
- scanf("%d", &ins);
- switch(ins) {
- case 3:
- return 0;
- case 0:
- scanf("%d", &s);
- memset(tree,0,sizeof(tree));
- break;
- case 1: {
- int x,y,a;
- scanf("%d %d %d", &x,&y,&a);
- x--, y--;
- update(0,0,0,s-1,0,s-1,x,y,a);
- break;
- }
- case 2: {
- int l,r,b,t;
- scanf("%d %d %d %d", &l,&b,&r,&t);
- l--, b--, r--, t--;
- printf("%d\n", query(0,0,0,s-1,0,s-1,
- l,r,b,t));
- break;
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement