1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <algorithm> 5 #include <cstring> 6 #define maxn 500005 7 #define maxm 800005 8 using namespace std; 9 10 int n,m,cnt,sum[maxn],pos[maxm],ans[maxm]; 11 struct date{ 12 int op,x,y,v,id; 13 }qs[maxm]; 14 15 bool comp(date x,date y){ 16 return x.x<y.x; 17 } 18 19 int lowbit(int x){ 20 return x&(-x); 21 } 22 23 void add(int x,int y){ 24 for (int i=x;i<=n;i+=lowbit(i)){ 25 sum[i]+=y; 26 } 27 } 28 29 int query(int x){ 30 int temp=0; 31 for (int i=x;i>0;i-=lowbit(i)){ 32 temp+=sum[i]; 33 } 34 return temp; 35 } 36 37 void cdq_solve(int l,int r){ 38 if (l==r) return; 39 int mid=(l+r)/2,temp=0; 40 cdq_solve(l,mid),cdq_solve(mid+1,r); 41 sort(qs+l,qs+mid+1,comp),sort(qs+mid+1,qs+r+1,comp); 42 int i=l,j=mid+1; 43 while (j<=r){ 44 while (qs[i].op==2&&i<=mid) i++; 45 while (qs[j].op==1&&j<=r) j++; 46 if (i<=mid&&qs[i].x<=qs[j].x) add(qs[i].y,qs[i].v),i++,temp=i-1; 47 else if (j<=r) ans[qs[j].id]+=query(qs[j].y),j++; 48 } 49 for (int t=l;t<=temp;t++) if (qs[t].op==1) add(qs[t].y,-qs[t].v); 50 } 51 52 int main(){ 53 memset(ans,0,sizeof(ans)); 54 memset(sum,0,sizeof(sum)); 55 int op,x1,x2,y1,y2; 56 scanf("%d",&n),m=cnt=0; 57 for (;;){ 58 scanf("%d",&op); 59 if (op==1){ 60 qs[++m].op=op,qs[m].id=m; 61 scanf("%d%d%d",&qs[m].x,&qs[m].y,&qs[m].v); 62 }else{ 63 if (op==2){ 64 scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 65 pos[++cnt]=m; 66 qs[++m].op=op,qs[m].x=x1-1,qs[m].y=y1-1,qs[m].id=m; 67 qs[++m].op=op,qs[m].x=x2,qs[m].y=y2,qs[m].id=m; 68 qs[++m].op=op,qs[m].x=x1-1,qs[m].y=y2,qs[m].id=m; 69 qs[++m].op=op,qs[m].x=x2,qs[m].y=y1-1,qs[m].id=m; 70 }else break; 71 } 72 } 73 cdq_solve(1,m); 74 for (int i=1;i<=cnt;i++) printf("%d\n",ans[pos[i]+1]+ans[pos[i]+2]-ans[pos[i]+3]-ans[pos[i]+4]); 75 }
相关文章: