1.hdu 1166 单点更新,维护区间和
/* *********************************************** Author :pk28 Created Time :2015/9/15 19:38:46 File Name :4.cpp ************************************************ */ #include <iostream> #include <cstring> #include <cstdlib> #include <stdio.h> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <iomanip> #include <list> #include <deque> #include <stack> #define ull unsigned long long #define ll long long #define mod 90001 #define INF 0x3f3f3f3f #define maxn 500000+5 #define cle(a) memset(a,0,sizeof(a)) const ull inf = 1LL << 61; const double eps=1e-5; using namespace std; //线段树 的单点更新和维护区间最大值 struct node{ int l,r,sum;//维护区间的和 }nod[maxn*4]; int a[maxn]; bool cmp(int a,int b){ return a>b; } int t,n,j; void push_up(int i){ nod[i].sum=nod[i<<1].sum+nod[(i<<1)|1].sum; //更新到父节点 } void build(int i,int l,int r){ nod[i].l=l; nod[i].r=r; // nod[i].sum=0; if(l==r){ nod[i].sum=a[j++]; //cout<<a[j-1]<<endl; return ; } int mid=(l+r)/2; build(i<<1,l,mid); build((i<<1)|1,mid+1,r); push_up(i); } void update(int i,int k,int w){ if(nod[i].l==k&&nod[i].r==k){ nod[i].sum+=w; return ; } int mid=(nod[i].l+nod[i].r)/2; if(k<=mid)update(i<<1,k,w); else update((i<<1)|1,k,w); push_up(i); } int quary(int i,int l,int r){ if(nod[i].l==l&&nod[i].r==r){ return nod[i].sum; } int mid=(nod[i].l+nod[i].r)/2; if(r<=mid) return quary(i<<1,l,r); else if(l>mid)return quary((i<<1)|1,l,r); else return quary(i<<1,l,mid)+quary((i<<1)|1,mid+1,r); } int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif //freopen("out.txt","w",stdout); cin>>t; int cnt=0; while(t--){ printf("Case %d:\n",++cnt); cin>>n; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } j=1; build(1,1,n); char s[100]; while(cin>>s){ if(s[0]=='E')break; else{ int x,y; scanf("%d %d",&x,&y); if(s[0]=='A'){ update(1,x,y); } else if(s[0]=='S'){ update(1,x,-y); } else{ printf("%d\n",quary(1,x,y)); } } } } return 0; }