どこでもドア:http://acm.hdu.edu.cn/showproblem.php?pid=1166
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<sstream>
#include<set>
#include<cstdlib>
#include<map>
#include<queue>
#include<fstream>
#include<array>
#include<vector>
using namespace std;
typedef long long LL;
const double INF = 0x3f3f3f3f;//最大值
const int MAXN=100007;
int n,tree[MAXN<<2];
void push_up(int i)
{
tree[i]=tree[i*2]+tree[i*2+1];
}
void build(int L,int R,int i)
{
if(L==R)
{
scanf("%d",&tree[i]);
return ;
}
int mid=(int)((L+R)>>1);
build(L,mid,i*2);
build(mid+1,R,i*2+1);
push_up(i);
}
void updateA(int L,int R,int l,int val,int i)
{
if(L==R&&l==L)
{
tree[i]+=val;
return ;
}
int mid=(int)((L+R)>>1);
if(l<=mid)
updateA(L,mid,l,val,i*2);
else
updateA(mid+1,R,l,val,i*2+1);
push_up(i);
}
void updateD(int L,int R,int l,int val,int i)
{
if(L==R&&l==L)
{
tree[i]-=val;
return ;
}
int mid=(int)((L+R)>>1);
if(l<=mid)
updateD(L,mid,l,val,i*2);
else
updateD(mid+1,R,l,val,i*2+1);
push_up(i);
}
int query(int L, int R, int l, int r, int i)
{
if(L==l&&R==r)
return tree[i];
int mid=(int)((L+R)>>1);
if(mid>=r)
return query(L,mid,l,r,i*2);
else if(mid<l)
return query(mid+1,R,l,r,i*2+1);
else return query(L,mid,l,mid,i*2)+query(mid+1,R,mid+1,r,i*2+1);
}
int main()
{
int t,x,y,k=1;
cin>>t;
while(t--)
{
cin>>n;
build(1,n,1);
string str;
cout<<"Case "<<k++<<":"<<endl;
while(cin>>str&&str!="End")
{
scanf("%d%d",&x,&y);
if(str=="Query")
{
printf("%d\n",query(1,n,x,y,1));
}
else if(str=="Add")
{
updateA(1, n, x, y, 1);
}
else if(str=="Sub")
{
updateD(1, n, x, y, 1);
}
}
}
return 0;
}