POJ 3468 A Simple Problem with Integers

来源:互联网 发布:c语言atan2函数 编辑:程序博客网 时间:2024/04/28 12:49
#include <iostream>#include <cstdio>#include <memory.h>using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1const int maxn=100000;long long f[maxn<<2],sum[maxn<<2],N,Q;void pushUp(int rt){sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void pushDown(int rt,int m){if(f[rt]){f[rt<<1]+=f[rt];//lazy标记传递给左右儿子f[rt<<1|1]+=f[rt];sum[rt<<1]+=f[rt]*(m-(m/2));//左儿子的和就等于左儿子的和+左儿子的区间长度乘以lazy值(保存的增减量)sum[rt<<1|1]+=f[rt]*(m/2);//右儿子同理f[rt]=0;//将父亲的lazy标记清空}}void build(int l,int r,int rt){sum[rt]=0;f[rt]=0;if(l==r){scanf("%lld",&sum[rt]);return;}int m=(l+r)>>1;build(lson),build(rson);pushUp(rt);}void update(int L,int R,long long v,int l,int r,int rt){if(L<=l&&r<=R){f[rt]+=v;//更新区间覆盖了当前结点区间,设置一个lazy标记sum[rt]+=v*(r-l+1);//将当前结点区间的和加上(当前区间长度乘以lazy的值)return;}pushDown(rt,r-l+1);int m=(l+r)>>1;if(L<=m)update(L,R,v,lson);if(R>m)update(L,R,v,rson);pushUp(rt);}long long query(int L,int R,int l,int r,int rt){if(L<=l&&r<=R){//查询区间覆盖了当前结点区间,返回当前区间的sumreturn sum[rt];}pushDown(rt,r-l+1);//判断是否设置了lazy标记,若有,传递下去.long long ret=0;int m=(l+r)>>1;if(L<=m)ret+=query(L,R,lson);if(R>m)ret+=query(L,R,rson);return ret;}int main(){while (scanf("%d%d",&N,&Q)==2){build(1,N,1);char str[10];for (int i=0;i<Q;++i){int a,b,c;scanf("%s",str);if(str[0]=='C'){scanf("%d%d%d",&a,&b,&c);if(a>b)swap(a,b);update(a,b,c,1,N,1);}else{scanf("%d%d",&a,&b);if(a>b)swap(a,b);printf("%lld\n",query(a,b,1,N,1));}}}return 0;}