#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
#include <string>
using namespace std;
struct stu
{
int l,r,num;
}ye[500005];
void init_tree(int l,int r,int k)
{
ye[k].l=l;
ye[k].r=r;
ye[k].num=0;
if(r == l)
return;
int mid = (l + r)/2;
init_tree(l,mid,k*2);
init_tree(mid+1,r,k*2+1);
}
void updata_tree(int i,int add,int k)
{
if(ye[k].l == i && ye[k].r == i)
{
ye[k].num+=add;
return;
}
int mid = (ye[k].l + ye[k].r)/2;
if(mid >= i)
{
updata_tree(i,add,k*2);
}
else
{
updata_tree(i,add,k*2+1);
}
ye[k].num=ye[k*2].num+ye[k*2+1].num;
}
int sum;
void search_tree(int l,int r,int k)
{
if(ye[k].l == l && ye[k].r == r)
{
sum+=ye[k].num;
return;
}
int mid=(ye[k].l + ye[k].r)/2;
if(mid >= r)
{
search_tree(l,r,k*2);
}
else if(mid < l)
{
search_tree(l,r,k*2+1);
}
else
{
search_tree(l,mid,k*2);
search_tree(mid+1,r,k*2+1);
}
}
int main()
{
int t,ss=0,i,a;
char st[20];
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
init_tree(1,n,1);
for(i = 1 ; i <= n ; i++)
{
scanf("%d",&a);
updata_tree(i,a,1);
}
printf("Case %d:\n",++ss);
while(scanf("%s",&st) && st[0] != 'E')
{
sum=0;
int a,b;
if(st[0] == 'A')
{
scanf("%d %d",&a,&b);
updata_tree(a,b,1);
}
else if(st[0] == 'S')
{
scanf("%d %d",&a,&b);
updata_tree(a,-b,1);
}
else
{
scanf("%d %d",&a,&b);
search_tree(a,b,1);
printf("%d\n",sum);
}
}
}
return 0;
}
线段树的模板
猜你喜欢
转载自blog.csdn.net/hujinhong145/article/details/81258916
今日推荐
周排行