一维线段树,插点问线
#include<iostream>
using namespace std;
const int size=200000;
#define LL(x) (x<<1)
#define RR(x) (x<<1|1)
struct Seg_Tree
{
int left,right,num;
int calmid(){
return (left+right)/2;
}
}tree[size];
int a[size];
int N;
//建树
int build(int left,int right,int idx)
{
tree[idx].left=left;
tree[idx].right=right;
if(left==right)
return tree[idx].num=a[left];
int mid=tree[idx].calmid();
return tree[idx].num=build(left,mid,LL(idx))+build(mid+1,right,RR(idx));
}
//查询
int query(int left,int right,int idx)
{
if(tree[idx].left==left&&tree[idx].right==right)
return tree[idx].num;
int mid=tree[idx].calmid();
if(right<=mid)
query(left,right,LL(idx));
else if(left>mid)
query(left,right,RR(idx));
else
return query(left,mid,LL(idx))+query(mid+1,right,RR(idx));
}
void update(int id,int num,int idx)
{
tree[idx].num+=num;
if(tree[idx].left==tree[idx].right)
return ;
int mid=tree[idx].calmid();
if(id<=mid)
update(id,num,LL(idx));
else
update(id,num,RR(idx));
}
int main()
{
//freopen("1.txt","r",stdin);
int T; scanf("%d",&T);
for(int cas=1;cas<=T;++cas)
{
cout<<"Case "<<cas<<":"<<endl;
scanf("%d",&N);
for(int i=1;i<=N;++i)
scanf("%d",&a[i]);
build(1,N,1); //建树
char str[10];
while(1)
{
scanf("%s",str);
if(str[0]=='E')
break;
int num1,num2; scanf("%d%d",&num1,&num2);
switch(str[0])
{
case 'Q':printf("%d\n",query(num1,num2,1));break;
case 'A':update(num1,num2,1);break;
case 'S':update(num1,-num2,1);break;
}
}
}
}