线段树写法。。。还在研究线段树中。。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#define maxn 50500
using namespace std;
int a[maxn];
int tree[maxn*4];
void pushup(int pos)
{
tree[pos]=tree[pos*2]+tree[pos*2+1];//二叉树
}
void buildtree(int l,int r,int pos)
{
if(l==r)
{
tree[pos]=a[l];
return ;
}
int mid=l+(r-l)/2;
buildtree(l,mid,pos*2);
buildtree(mid+1,r,2*pos+1);
pushup(pos);
}
void update(int x,int k,int l,int r,int pos)
{
if(l==r)
{
tree[pos]+=k;
return ;
}
int mid=l+(r-l)/2;
if(x<=mid)
{
update(x,k,l,mid,2*pos);
}
else
{
update(x,k,mid+1,r,2*pos+1);
}
pushup(pos);
}
int query(int ql,int qr,int l,int r,int pos)
{
if(ql<=l&&qr>=r)
{
return tree[pos];
}
int mid=l+(r-l)/2;
int sum=0;
if(ql<=mid)
{
sum+=query(ql,qr,l,mid,2*pos);
}
if(qr>mid)
{
sum+=query(ql,qr,mid+1,r,2*pos+1);
}
return sum;
}
int main()
{
int t,n;
int p,q;
char s[1001];
scanf("%d",&t);
for(int k=1;k<=t;k++)
{
scanf("%d",&n);
memset(a,0,sizeof(a));
for(int i=1;i<=n;++i)
{
scanf("%d",&a[i]);
}
buildtree(1,n,1);
printf("Case %d:\n",k);
//getchar();
while(scanf("%s",&s)!=EOF)
{
if(s[0]=='E')
{
break;
}
if(s[0]=='S')
{
scanf("%d%d",&p,&q);
update(p,-q,1,n,1);
}
if(s[0]=='A')
{
scanf("%d%d",&p,&q);
update(p,q,1,n,1);
}
if(s[0]=='Q')
{
scanf("%d%d",&p,&q);
printf("%d\n",query(p,q,1,n,1));
}
}
}
return 0;
}