第一道线段树,没有想象中难时间复杂度为logn
#include <iostream>
#include <string>
using namespace std;
const int MAXN=55555;
int stree[MAXN<<2];
void build(int l,int r,int rt)
{
if(l==r)
{
int t;
scanf("%d",&stree[rt]);
return;
}
int mid=(l+r)>>1;
build(l,mid,rt<<1);
build(mid+1,r,rt<<1|1);
stree[rt]=stree[rt<<1]+stree[rt<<1|1];
}
int query(int l2,int r2,int l1,int r1,int rt)
{
if(l2<=l1&&r1<=r2)
return stree[rt];
int mid=(l1+r1)>>1;
int ans=0;
if(l2<=mid) ans+=query(l2,r2,l1,mid,rt<<1);
if(r2>mid) ans+=query(l2,r2,mid+1,r1,rt<<1|1);
return ans;
}
void update(int a,int b,int l,int r,int rt)
{
if(l==r)
{
stree[rt]+=b;
return;
}
int mid=(l+r)>>1;
if(a<=mid) update(a,b,l,mid,rt<<1);
else update(a,b,mid+1,r,rt<<1|1);
stree[rt]=stree[rt<<1]+stree[rt<<1|1];
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
printf("Case %d:\n",i);
int m;
cin>>m;
build(1,m,1);
string str;
int a,b;
while(cin>>str)
{
if(str[0]=='E') break;
cin>>a>>b;
if(str[0]=='Q') printf("%d\n",query(a,b,1,m,1));
else if(str[0]=='S') update(a,-b,1,m,1);
else if(str[0]=='A') update(a,b,1,m,1);
}
}
return 0;
}