标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 54389 Accepted Submission(s): 22819
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int MAX=50000; const int MAXNODE=850000; struct army { int left; int right; int num; } node[MAXNODE]; void buildtree(int i,int l,int r) //建树 { node[i].left=l; node[i].right=r; node[i].num=0; if(l==r) { return; } buildtree(i*2,l,(l+r)/2); buildtree(i*2+1,(l+r)/2+1,r); } void Insert(int d,int n,int i) //对最小的儿子的值进行更改,并更新其所有父辈的值 { int mid; if(node[i].left==node[i].right&&node[i].left==d) { node[i].num+=n; return; } mid=(node[i].left+node[i].right)/2; if(d<=mid) Insert(d,n,i*2); else Insert(d,n,i*2+1); node[i].num=node[i*2].num+node[i*2+1].num; } int sum=0; void query(int i,int l,int r)// { if(node[i].left==l&&node[i].right==r) { sum+=node[i].num; return; } i*=2; if(l<=node[i].right) if(r<=node[i].right) query(i,l,r); else query(i,l,node[i].right); i++; if(r>=node[i].left) if(l>=node[i].left) query(i,l,r); else query(i,node[i].left,r); } int main() { int Case,t,n,sta,d,num,r,l; char zl[8]; cin>>t; for(int Case=1; Case<=t; Case++) { cin>>n; buildtree(1,1,n); for(int i=1; i<=n; i++) { cin>>sta; Insert(i,sta,1); } cout<<"Case "<<Case<<‘:‘<<endl; while(1) { scanf("%s",zl); if(zl[0]==‘E‘) { break; } else if(zl[0]==‘Q‘) { scanf("%d%d",&l,&r); sum=0; query(1,l,r); cout<<sum<<endl; } else { scanf("%d%d",&d,&num); if(zl[0]==‘A‘) Insert(d,num,1); else if(zl[0]==‘S‘) Insert(d,-num,1); } } } return 0; }
标签:
原文地址:http://www.cnblogs.com/jasonlixuetao/p/4530643.html