第一道線段樹….
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <stdlib.h>
using namespace std;
struct rope
{
int l;
int r;
int d;
}sum[200000];
void create(int l,int r,int i)
{
sum[i].l=l;
sum[i].r=r;
sum[i].d=0;
if(l==r)
{
return ;
}
int mid=(l+r)/2;
create(l,mid,i*2);
create(mid+1,r,i*2+1);
}
void insert(int pos,int data,int i)
{
int l=sum[i].l,r=sum[i].r;
int mid=(l+r)/2;
if(l==pos&&r==pos)
{
sum[i].d+=data;
return ;
}
if(pos<=mid) insert(pos,data,i*2);
else insert(pos,data,i*2+1);
sum[i].d=sum[i*2].d+sum[i*2+1].d;//由兩子結點更新
}
int Query(int l,int r,int i)
{
int ans=0;
int mid=(sum[i].l+sum[i].r)/2;
if(l==sum[i].l&&r==sum[i].r)
return sum[i].d;
else if(r<=mid) ans=Query(l,r,i*2);
else if(l>mid) ans=Query(l,r,i*2+1);
else if(l<=mid&&r>mid)
{
ans=Query(l,mid,i*2)+Query(mid+1,r,i*2+1);
}
return ans;
}
int main()
{
int T,Case=1;
scanf("%d",&T);
while(T--)
{
int i,j,n,ans;
scanf("%d",&n);
create(1,n,1);
for(i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
insert(i,x,1);
}
printf("Case %d:\n",Case++);
char ch[10];
while(scanf("%s",ch),ch[0]!='E')
{
scanf("%d%d",&i,&j);
if(ch[0]=='Q')
{
ans=Query(i,j,1);
printf("%d\n",ans);
}
else
{
if(ch[0]=='A')
insert(i,j,1);
else insert(i,-j,1);
}
}
}
return 0;
}
加油。