#include<iostream>
#include<stdio.h>
#include<string.h>
#include<cmath>
#include<limits.h>
#include<string>
#define MAX 50001
#define L(x) (x<<1)
#define R(x) (x<<1|1)
using namespace std;
struct node
{
int l;
int r;
int sum;
}a[MAX*3];
int val[MAX];
void build(int t,int l,int r)
{
int mid=(l+r)/2;
a[t].l=l;
a[t].r=r;
if(l==r)
{
a[t].sum=val[l];
return ;
}
build(L(t),l,mid);
build(R(t),mid+1,r);
a[t].sum=a[L(t)].sum+a[R(t)].sum;
}
int p;
void update(int t,int v)
{
int l=a[t].l;
int r=a[t].r;
if(l==r)
{
a[t].sum+=v;
return ;
}
int m=l+(r-l)/2;
if(p<=m) update(L(t),v);
else
update(R(t),v);
a[t].sum+=v;
}
int ql,qr;
int query(int t)
{
int l=a[t].l;
int r=a[t].r;
int m=l+(r-l)/2;
int ans=0;
if(ql<=l&&r<=qr)return a[t].sum;
if(ql<=m)ans+=query(L(t));
if(m<qr)ans+=query(R(t));
return ans;
}
int main()
{
int t,n,i,k,j;
int v;
char s[10];
scanf("%d",&t);
for(k=1;k<=t;k++)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&val[i]);
build(1,1,n);
printf("Case %d:\n",k);
while(1)
{
scanf("%s",s);
if(s[0]=='E')break;
if(s[0]=='Q')
{
scanf("%d%d",&ql,&qr);
printf("%d\n",query(1));
}
else
if(s[0]=='A')
{
scanf("%d%d",&p,&v);
update(1,v);
}
else
{
scanf("%d%d",&p,&v);
update(1,-v);
}
}
}
return 0;
}hdu1166
最新推荐文章于 2020-02-25 19:08:43 发布
289

被折叠的 条评论
为什么被折叠?



