【HDU 1166】【模板】敌兵布阵

来源:互联网 发布:国际顶级域名证书 编辑:程序博客网 时间:2024/05/16 07:18

感觉自己以前写的那个线段树并不是特别漂亮
或者说
又臭又长(手动@减维)
于是
改进一波代码风格
稍微飘逸一点

就看这个最简单的单点修改求区间和吧

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1const int maxn=55555;int sum[maxn<<2];void Pushup(int rt){    sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void Build(int l,int r,int rt){    if(l==r) {scanf("%d",&sum[rt]);return;}    int m=(l+r)>>1;    Build(lson);    Build(rson);    Pushup(rt);}void Update(int p,int add,int l,int r,int rt){    if(l==r) {sum[rt]+=add;return;}    int m=(l+r)>>1;    if(p<=m) Update(p,add,lson);    else Update(p,add,rson);    Pushup(rt);}int Query(int L,int R,int l,int r,int rt){    if(L<=l&&r<=R) return sum[rt];    int m=(l+r)>>1;    int ret=0;    if(L<=m) ret+=Query(L,R,lson);    if(R>m) ret+=Query(L,R,rson);    return ret;}int main(){    int T,n;    scanf("%d",&T);    for(int cas=1;cas<=T;cas++)    {        printf("Case %d:\n",cas);        scanf("%d",&n);        Build(1,n,1);        char op[10];        while(scanf("%s",&op))        {            if(op[0]=='E') break;            int aa,bb;            scanf("%d%d",&aa,&bb);            if(op[0]=='Q') printf("%d\n",Query(aa,bb,1,n,1));            else if(op[0]=='S') Update(aa,-bb,1,n,1);            else Update(aa,bb,1,n,1);        }    }    return 0;}