树状数组:
#include<stdio.h>
#include<string.h>
using namespace std;
int n,a[500010];
char sh[500];
int lowbit(int i)
{
return i&(-i);
}
int sum(int i)
{
int sum=0;
while(i>0)
{
sum+=a[i];i-=lowbit(i);
}
return sum;
}
void update(int i,int val)
{
while(i<=n)
{
a[i]+=val;i+=lowbit(i);
}
}
int main()
{
int val,m,i,j,k,x,y,t,z=1;
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&val);update(i,val);
}
printf("Case %d:\n",z++);
while(scanf("%s",sh)!=EOF)
{
if(sh[0]=='E') break;
scanf("%d %d",&x,&y);
if(sh[0]=='A') update(x,y);
else if(sh[0]=='S') update(x,-y);
else printf("%d\n",sum(y)-sum(x-1));
}
}
return 0;
}
线段树:
#include<stdio.h>
#include<string.h>
using namespace std;
struct Tree
{
int l,r,mid;
int sum;
}tree[150010];
char commend[30];
int ai[50020];
void build(int i,int a,int b)
{
tree[i].l=a;
tree[i].r=b;
tree[i].mid=(a+b)/2;
tree[i].sum=0;
if(a==b)
tree[i].sum=ai[a];
else
{
build(2*i,a,(a+b)/2);
build(2*i+1,(a+b)/2+1,b);
tree[i].sum=tree[2*i].sum+tree[2*i+1].sum;
}
}
void update(int i,int a,int b,int c)
{
if(a==tree[i].l&&b==tree[i].r)
{
tree[i].sum+=c;
return;
}
if(b<=tree[i].mid)
update(2*i,a,b,c);
else if(tree[i].mid<a)
update(2*i+1,a,b,c);
else
{
update(2*i,a,tree[i].mid,c);
update(2*i+1,tree[i].mid+1,b,c);
}
tree[i].sum=tree[2*i].sum+tree[2*i+1].sum;
}
int query(int i,int a,int b)
{
if(a<=tree[i].l&&tree[i].r<=b)
return tree[i].sum;
if(b<=tree[i].mid)
return query(2*i,a,b);
else if(tree[i].mid<a)
return query(2*i+1,a,b);
else
return query(2*i,a,tree[i].mid)+query(2*i+1,tree[i].mid+1,b);
}
int main()
{
int t,n,m,i,j,k,a,b,c,z=1;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
printf("Case %d:\n",z++);
for(i=1;i<=n;i++)
{
scanf("%d",&ai[i]);
}
build(1,1,n);
while(scanf("%s",commend)!=EOF)
{
if(commend[0]=='E') break;
else if(commend[0]=='A')
{
scanf("%d%d",&a,&c);
update(1,a,a,c);
}
else if(commend[0]=='S')
{
scanf("%d%d",&a,&c);
update(1,a,a,-c);
}
else if(commend[0]=='Q')
{
scanf("%d%d",&a,&b);
printf("%d\n",query(1,a,b));
}
}
}
return 0;
}