标签:
ACM大牛的线段树总结。看完就懂了。(代码也是抄自那里。。
hdu1166 (基本线段树(然后表示不明白为什么输出优化WA了
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define rep(i,n) for(int i=1;i<=n;i++)
#define clr(x,c) memset(x,c,sizeof(x))
#define qwq(x) for(edge *o=head[x];o;o=o->next)
#define lson l,m,x<<1
#define rson m+1,r,x<<1|1
int read(){
int x=0;char c=getchar();bool f=true;
while(!isdigit(c)) {
if(c==‘-‘) f=false;c=getchar();
}
while(isdigit(c)) x=x*10+c-‘0‘,c=getchar();
return f?x:-x;
}
void print(int x){
char ch[10];int cur=0;
if(x<0) putchar(‘-‘),x=-x;
while(x) ch[++cur]=x%10+‘0‘,x/=10;
for(int i=cur;i;i--) putchar(ch[i]);
putchar(‘\n‘);
return ;
}
const int nmax=50005;
const int inf=0x7f7f7f7f;
int sum[nmax<<2];
void pushup(int x){
sum[x]=sum[x<<1]+sum[x<<1|1];return ;
}
int query(int l,int r,int x,int tl,int tr){
if(tl<=l&&tr>=r) return sum[x];
int m=(l+r)>>1;int tmp=0;
if(tl<=m) tmp+=query(lson,tl,tr);
if(tr>m) tmp+=query(rson,tl,tr);
return tmp;
}
void build(int l,int r,int x){
if(l==r) {
sum[x]=read();return ;
}
int m=(l+r)>>1;
build(lson);build(rson);pushup(x);
}
void update(int l,int r,int x,int p,int add){
if(l==r) {
sum[x]+=add;return ;
}
int m=(l+r)>>1;
p<=m?update(lson,p,add):update(rson,p,add);
pushup(x);
}
int main(){
int t=read();
rep(i,t){
printf("Case %d:\n",i);
int n=read();
build(1,n,1);
char c[10];
while(scanf("%s",c)){
if(c[0]==‘E‘) break;
int a=read(),b=read();
if(c[0]==‘Q‘) printf("%d\n",query(1,n,1,a,b));//print(query(1,n,1,a,b));
else if(c[0]==‘S‘) update(1,n,1,a,-b);
else update(1,n,1,a,b);
}
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/fighting-to-the-end/p/5634252.html