您的位置:首页 > 其它

线段树练习3

2014-10-22 21:05 246 查看
#include<iostream>

#include<cstdio>

using namespace std;

const long long maxn=10000000;

long long a[maxn]={0};

struct node

{

long long left,right,num,lazy;

}f[maxn];

void build(long long k,long long s,long long t)

{

long long mid=(s+t)/2;

f[k].left=s;f[k].right=t;

if(s==t){f[k].num=a[s];return ;}

else

{

build(k*2,s,mid);

build(k*2+1,mid+1,t);

f[k].num=f[k*2].num+f[k*2+1].num;

}

}

void push(long long k,long long l)

{

     f[k*2].lazy+=f[k].lazy;

      f[k*2+1].lazy+=f[k].lazy;

      f[k*2].num+=(l-l/2)*f[k].lazy;

       f[k*2+1].num+=(l/2)*f[k].lazy;

       f[k].lazy=0;

}

long long tt=0;

void ins(long long k,long long a,long long b,long long x)

{

    // tt++;

     long long l=f[k].left,r=f[k].right;

     if(a==l&&b==r)

     {

     f[k].lazy+=x;

     f[k].num+=(b-a+1)*x;

     return ;

     }

     if(f[k].lazy)push(k,r-l+1);

     long long mid=(l+r)/2;

     if(b<=mid)ins(k*2,a,b,x);

    else if(a>mid)ins(k*2+1,a,b,x);

    else

    {ins(k*2,a,mid,x);

    ins(k*2+1,mid+1,b,x);}

     f[k].num=f[k*2].num+f[k*2+1].num;

}

long long cont(long long k,long long a,long long b)

{

  long long l=f[k].left,r=f[k].right;

  if(l==a&&r==b){return f[k].num;}

  if(f[k].lazy){push(k,r-l+1);}

  long long mid=(l+r)/2;

  if(b<=mid){return cont(k*2,a,b);}

  else if(a>mid){return cont(k*2+1,a,b);}

  else{

  return cont(k*2,a,mid)+cont(k*2+1,mid+1,b);}

}

int main()

{

    long long n,m;

    cin>>n;

    for(long long i=1;i<=n;i++)

    cin>>a[i];

    build (1,1,n);

    cin>>m;

    long long t,k,x,y;

    for(long long i=1;i<=m;i++)

    {  cin>>t;

    if(t==1){cin>>x>>y>>k;ins(1,x,y,k);

    }

    else 

    {cin>>x>>y;

    cout<<cont(1,x,y)<<endl;

    }

    

    }

    

    //cout<<tt;

   // while(1);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  线段树lazy