线段树水题,练习一下线段树的写法
虽然我的写法和网上大多数的写法不同,但感觉我这种写法更好理解,写起来也更简便
单点更新
#include<stdio.h>
#define N 50005
struct Node{
int l,r,sum;
}t[N<<2];
int n;
void build(int cur,int l,int r){
t[cur].l=l;
t[cur].r=r;
t[cur].sum=0;
if(l==r) return;
int mid=(l+r)>>1;
build(cur*2,l,mid);
build(cur*2+1,mid+1,r);
}
void update(int cur,int i,int num) {
if(t[cur].r<i||t[cur].l>i) return;
if(t[cur].l<=i&&t[cur].r>=i){
t[cur].sum+=num;
}
if(t[cur].l==t[cur].r) {
return;
}
update(cur*2,i,num);
update(cur*2+1,i,num);
}
int query(int i,int l,int r){
if(t[i].r<l||t[i].l>r) return 0;
if(t[i].l>=l&&t[i].r<=r) {
return t[i].sum;
}
return query(i*2,l,r)+query(i*2+1,l,r);
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int t;
char s[20];
scanf("%d",&t);
int cas=1;
while(t--){
scanf("%d",&n);
build(1,1,n);
int tmp;
for(int i=1;i<=n;i++) {
scanf("%d",&tmp);
update(1,i,tmp);
}
printf("Case %d:\n",cas++);
int tmp1,tmp2;
while(scanf("%s",s)){
if(s[0]=='Q'){
scanf("%d%d",&tmp1,&tmp2);
printf("%d\n",query(1,tmp1,tmp2));
}
else if(s[0]=='A'){
scanf("%d%d",&tmp1,&tmp2);
update(1,tmp1,tmp2);
}
else if(s[0]=='S'){
scanf("%d%d",&tmp1,&tmp2);
update(1,tmp1,-tmp2);
}
else break;
}
}
return 0;
}