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