[POJ3468] modified segment tree section

 

 

 

#include<cstdio>
using namespace std;
const int N=1e6+10;
typedef long long ll;
 
ll sum[N*4],lazy[N*4],len[N*4]; 
int n,m;
void build(int id,int l,int r)
{
    len[id]=r-l+1;
    if(l==r)
    {
        scanf("%lld",&sum[id]);
        return ;
    }
    int mid=(l+r)>>1;
    build(id<<1,l,mid);
    build(id<<1|1,mid+1,r);
    sum[id]=sum[id<<1]+sum[id<<1|1];
}
void pushdown(int id)
{
    if(lazy[id])
    {
        lazy[id<<1]+=lazy[id];
        lazy[id<<1|1]+=lazy[id];
        
        sum[id<<1]+=len[id<<1]*lazy[id];
        sum[id<<1|1]+=len[id<<1|1]*lazy[id];
        lazy[id]=0;
    }
}
ll qu(int id,int l,int r,int ql,int qr)
{
    if(ql<=l&&r<=qr)
    {
        return sum[id];
    }
    pushdown(id);
    int mid=(l+r)>>1;
    ll ans=0;
    if(ql<=mid) ans+=qu(id<<1,l,mid,ql,qr);
    if(qr>mid) ans+=qu(id<<1|1,mid+1,r,ql,qr);
    return ans;
}
void up(int id,int l,int r,int ql,int qr,ll val)
{
    if(ql<=l&&r<=qr)
    {
        lazy[id]+=val;
        sum[id]+=len[id]*val;
        return ;
    }
    pushdown(id);
    int mid=(l+r)>>1;
    if(ql<=mid) up(id<<1,l,mid,ql,qr,val);
    if(qr>mid) up(id<<1|1,mid+1,r,ql,qr,val);
    sum[id]=sum[id<<1]+sum[id<<1|1];
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        build(1,1,n);
        while(m--)
        {
            char s[5];
            scanf("%s",s);
            //printf("a[1].id:%d\n\n",a[1].sum);
            if(s[0]=='Q')
            {
                int x,y;
                scanf("%d%d",&x,&y);
                printf("%lld\n",qu(1,1,n,x,y));
            }
            else
            {
                int x,y;
                ll z;
                scanf("%d%d%lld",&x,&y,&z);
                up(1,1,n,x,y,z);
            }
        }
    }
}

 

 

Guess you like

Origin www.cnblogs.com/liyexin/p/12588979.html