hdu-1166(线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166
思路:线段树模板
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn = 50050; int a[maxn*4],n; void build(int k,int l,int r) { if(l==r) { scanf("%d",&a[k]); return ; } int mid=(l+r)/2; build(k*2,l,mid); build(k*2+1,mid+1,r); a[k]=a[k*2]+a[k*2+1]; } void update(int k,int l,int r,int x,int pos) { if(l==r) { a[k]+=x; return ; } int mid=(l+r)/2; if(pos<=mid) update(k*2,l,mid,x,pos); else update(k*2+1,mid+1,r,x,pos); a[k]=a[k*2]+a[k*2+1]; } int query(int k,int l,int r,int x,int y) { if(x<=l&&y>=r) return a[k]; int mid=(l+r)/2; if(y<=mid) return query(k*2,l,mid,x,y); if(x>mid) return query(k*2+1,mid+1,r,x,y); return query(k*2,l,mid,x,y)+query(k*2+1,mid+1,r,x,y); } int main(void) { int t,i,j,pt=1; char str[50]; scanf("%d",&t); while(t--) { scanf("%d",&n); build(1,1,n); printf("Case %d:\n",pt++); while(~scanf("%s",str)) { if(strcmp(str,"End")==0) break; if(str[0]=='Q') { scanf("%d %d",&i,&j); printf("%d\n",query(1,1,n,i,j)); } else if(str[0]=='A') { scanf("%d %d",&i,&j); update(1,1,n,j,i); } else if(str[0]=='S') { scanf("%d %d",&i,&j); update(1,1,n,-j,i); } } } return 0; }