#include<stdio.h>#include<algorithm>#include<string.h>using namespace std;int tree[2000000];void build(int left,int right,int root){ int mid=(left+right)/2; if(left==right) { scanf("%d",&tree[root]); return ; } build(left,mid,root*2); build(mid+1,right,root*2+1); tree[root]=tree[root*2]+tree[root*2+1];}void update(int p,int add,int left,int right,int root){ int mid=(left+right)/2; if(left==right) { tree[root]+=add; return ; } if(p<=mid) update(p,add,left,mid,root*2); else update(p,add,mid+1,right,root*2+1); tree[root]=tree[root*2]+tree[root*2+1];} int find(int x,int y,int left,int right,int root) { if(x<=left&&y>=right) { return tree[root]; } int sum=0; int mid=(left+right)/2; if(x<=mid) { sum+=find(x,y,left,mid,root*2); } if(y>mid) sum+=find(x,y,mid+1,right,root*2+1); return sum; }int main(){ int t,n,a,s; int i; char b[10]; scanf("%d",&t); for(i=1;i<=t;i++) { printf("Case %d:\n",i); scanf("%d",&n); build(1,n,1); while(scanf("%s",b)) { if(strcmp(b,"End")==0) break; scanf("%d %d",&a,&s); if(strcmp(b,"Add")==0) update(a,s,1,n,1); else if(strcmp(b,"Sub")==0) update(a,-s,1,n,1); else if(strcmp(b,"Query")==0) { printf("%d\n",find(a,s,1,n,1)); } } } return 0;}
一道简单的线段树模版单点更新
下面是树状数组
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 50005
int c[N];
int n;
int lowbit(int x){
return (x&-x);
}
void add(int i,int w){
while(i<=n){
c[i]+=w;
i=i+lowbit(i);
}
}
int sum(int i){
int sum=0;
while(i>0){
sum+=c[i];
i=i-lowbit(i);
}
return sum;
}
int main()
{
int t,w,k=1,i,j;
int a,b;
char s[10];
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<=n;i++)
c[i]=0;
for(i=1; i<=n; i++)
{
scanf("%d",&w);
add(i,w);
}
printf("Case %d:\n",k++);
while(1)
{
scanf("%s",s);
if(s[0]=='E')
break;
else if(s[0]=='A')
{
scanf("%d %d",&a,&b);
add(a,b);
}
else if(s[0]=='S')
{
scanf("%d %d",&a,&b);
add(a,-b);
}
else if(s[0]=='Q')
{
scanf("%d %d",&a,&b);
printf("%d\n",sum(b)-sum(a-1));
}
}
}
return 0;
}