poj3468 A Simple Problem with Integers(线段树成段更新)

来源:互联网 发布:医学人工智能联盟 编辑:程序博客网 时间:2024/05/07 17:30

题意:给定一串数字,进行两种固定操作:一,求某区间内的和;二对某区间内的所以数加上一指定数字。

水题

//4824 KB 2563 ms#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#define ll long long#define M 100005#define root 1,n,1#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1using namespace std;ll sum[M<<2],add[M<<2];void pushup(int rt){    sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void pushdown(int rt,int m){    if(!add[rt]) return;    add[rt<<1]+=add[rt];    add[rt<<1|1]+=add[rt];    sum[rt<<1]+=add[rt]*(m-(m>>1));    sum[rt<<1|1]+=add[rt]*(m>>1);    add[rt]=0;}void build(int l,int r,int rt){    add[rt]=0;    if(l==r){        scanf("%I64d",&sum[rt]);        return;    }    int m=(l+r)>>1;    build(lson);    build(rson);    pushup(rt);}void update(int L,int R,int c,int l,int r,int rt){    if(L<=l&&r<=R){        sum[rt]+=c*(r-l+1);        add[rt]+=c;        return;    }    pushdown(rt,r-l+1);    int m=(l+r)>>1;    if(L<=m) update(L,R,c,lson);    if(R>m) update(L,R,c,rson);    pushup(rt);}ll query(int L,int R,int l,int r,int rt){    if(L<=l&&r<=R){        return sum[rt];    }    pushdown(rt,r-l+1);    int m=(l+r)>>1;    ll ans=0;    if(L<=m) ans+=query(L,R,lson);    if(R>m) ans+=query(L,R,rson);    return ans;}int main(){    int n,m;    scanf("%d%d",&n,&m);    build(root);    while(m--){        char ch[5];        scanf("%s",ch);        if(ch[0]=='C'){            int a,b,c;            scanf("%d%d%d",&a,&b,&c);            update(a,b,c,root);        }        else{            int a,b;            scanf("%d%d",&a,&b);            printf("%I64d\n",query(a,b,root));        }    }    return 0;}



0 0