题目链接:https://cn.vjudge.net/contest/269834#problem/A
代码:
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
struct node
{
int l,r,num;
}s[500000];
int h[500000];
int creat(int t,int l,int r)//建树
{
if(l==r)
{
s[t].l=l;
s[t].r=r;
return s[t].num=h[l];
}
s[t].l=l;
s[t].r=r;
return s[t].num=creat(t<<1,l,(l+r)>>1)+creat((t*2)+1,((l+r)/2)+1,r);
}
void addre(int t,int a,int b)//单点更新
{
if(a==s[t].l&&a==s[t].r)
{
s[t].num=s[t].num+b;
return ;
}
if(((s[t].l+s[t].r)>>1)>=a)
{
addre(t*2,a,b);
}
else
{
addre(t*2+1,a,b);
}
s[t].num=s[t<<1].num+s[t*2+1].num;
}
int query(int t,int l,int r)//区间查询
{
int mid=(s[t].l+s[t].r)>>1;
if(s[t].l==l&&s[t].r==r)
{
return s[t].num;
}
if(mid>=r)
{
return query(t*2,l,r);
}
else if(mid<l)
{
return query(t*2+1,l,r);
}
else
{
return query(t*2,l,mid)+query(t*2+1,mid+1,r);
}
}
int main()
{
int T;
int n;
int a,b,mm=0;
char m[20];
scanf("%d",&T);
while(T--)
{
++mm;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&h[i]);
}
creat(1,1,n);
printf("Case %d:\n",mm);
while(~scanf("%s",m))
{
if(strcmp(m,"End")==0) break;
if(strcmp(m,"Add")==0)
{
scanf("%d %d",&a,&b);
addre(1,a,b);
}
if(strcmp(m,"Sub")==0)
{
scanf("%d %d",&a,&b);
addre(1,a,-b);
}
if(strcmp(m,"Query")==0)
{
scanf("%d %d",&a,&b);
printf("%d\n",query(1,a,b));
}
}
}
return 0;
}