线段树,
if(r<=mid)
find(l,r,k*2);
else if(l>mid)
find(l,r,k*2+1);
这个地方需要注意一下,<=和>
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int n,sum;
char s[10];
struct node
{
int l,r,v;
} d[150015];
void build(int l,int r,int k)
{
if(l==r)
{
d[k].l=l;
d[k].r=r;
d[k].v=0;
return;
}
d[k].r=r;
d[k].l=l;
d[k].v=0;
int mid=(l+r)/2;
build(l,mid,k*2);
build(mid+1,r,k*2+1);
}
void add(int temp,int i,int k)
{
if(d[k].r==d[k].l&&d[k].r==i)
{
d[k].v+=temp;
//printf("%d %d\n",i,d[k].v);
return;
}
int mid=(d[k].l+d[k].r)/2;
if(i<=mid)
add(temp,i,k*2);
else
add(temp,i,k*2+1);
d[k].v=d[k*2].v+d[k*2+1].v;
}
void find(int l,int r,int k)
{
if(d[k].r==r&&d[k].l==l)
{
sum+= d[k].v;
return;
}
int mid=(d[k].l+d[k].r)/2;
if(r<=mid)
find(l,r,k*2);
else if(l>mid)
find(l,r,k*2+1);
else
{
//printf("%d %d %d\n",l,mid,r);
find(l,mid,k*2);
find(mid+1,r,k*2+1);
}
}
int main()
{
int T,a,b;
scanf("%d",&T);
for(int k=1; k<=T; k++)
{
scanf("%d",&n);
build(1,n,1);
for(int i=1; i<=n; i++)
{
scanf("%d",&a);
add(a,i,1);
}
printf("Case %d:\n",k);
while(1)
{
int i;
scanf("%s",s);
if(s[0]=='E')
break;
scanf("%d %d",&i,&a);
if(s[0]=='A')
add(a,i,1);
if(s[0]=='S')
add(-a,i,1);
if(s[0]=='Q')
{
sum=0;
find(i,a,1);
printf("%d\n",sum);
}
}
}
return 0;
}
/*
1
10
1 2 3 4 5 6 7 8 9 10
Query 1 3
Add 3 6
Query 2 7
Sub 10 2
Add 6 3
Query 3 10
End
*/