您的位置:首页 > 其它

线段树【模板】

2016-11-19 17:29 309 查看
/***************************************HDU 1166 敌兵布阵***************************************/#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<climits>#include<string>#include<queue>#include<stack>#include<set>#include<map>#include<algorithm>using namespace std;#define rep(i,j,k)for(i=j;i<k;i++)#define per(i,j,k)for(i=j;i>k;i--)#define MS(x,y)memset(x,y,sizeof(x))#define max(a,b) a>b?a:b#define min(a,b) a<b?a:b#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1typedef long long LL;const int INF=0x7ffffff;#define lson rt<<1, l, m#define rson rt<<1|1, m+1, rconst int M=5e4+1;int n,m,i,j,k;int sum[M<<2];void build(int rt,int l,int r){int m;if(l==r){scanf("%d",&sum[rt]);return;}m=(l+r)/2;build(lson);build(rson);sum[rt]=sum[rt*2]+sum[rt*2+1];}int query(int L,int R,int rt,int l,int r){int m,ans;if(l>=L&&r<=R)return sum[rt];m=(l+r)/2;ans=0;if(L<=m)ans+=query(L,R,lson);if(R>=m+1)ans+=query(L,R,rson);return ans;}void update(int p,int add,int rt,int l,int r){int m;if(l==r){sum[rt]+=add;return;}m=(l+r)/2;if(p<=m)update(p,add,lson);else update(p,add,rson);sum[rt]=sum[rt*2]+sum[rt*2+1];}int main(){int T;int cas=1;char str[10];scanf("%d",&T);while(T--){scanf("%d",&n);build(1,1,n);printf("Case %d:\n",cas++);while(scanf("%s",str),str[0]!='E'){int a,b;scanf("%d%d",&a,&b);if(str[0]=='Q')printf("%d\n",query(a,b,1,1,n));if(str[0]=='S')update(a,-b,1,1,n);if(str[0]=='A')update(a,b,1,1,n);}}return 0;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: