线段树模板,全网最好!没有之一,新手学习必看

#include<bits/stdc++.h>//一般的线段树模板,但是非常简单,
using namespace std;
struct node{
long long l,r,sum;
}t[300001];
long long a[100001],lazy[300001];
void bt(long long x,long long l,long long r)
{
t[x].l=l;
t[x].r=r;
if(l==r)
{
t[x].sum=a[l];
return;
}
bt(x*2,l,(l+r)>>1);
bt(x*2+1,1+((l+r)>>1),r);
t[x].sum=t[x*2].sum+t[x*2+1].sum;
}
void pushdown(long long x)
{
long long mid=(t[x].l+t[x].r)/2;
t[x*2].sum+=(mid-t[x].l+1)*lazy[x];
t[x*2+1].sum+=(t[x].r-mid)*lazy[x];
lazy[x*2]+=lazy[x];
lazy[x*2+1]+=lazy[x];
lazy[x]=0;
}
void update(long long x,long long l,long long r,long long k)
{
if(t[x].r<=r&&t[x].l>=l)
{
t[x].sum+=(t[x].r-t[x].l+1)*k;
lazy[x]+=k;
return ;
}
if(t[x].r<l||t[x].l>r)
return;
if(lazy[x])pushdown(x);
update(x*2,l,r,k);
update(x*2+1,l,r,k);
t[x].sum=t[x*2].sum+t[x*2+1].sum;
}
long long query(long long x,long long l,long long r)
{
if(t[x].r<=r&&t[x].l>=l)
return t[x].sum;
if(t[x].r<l||t[x].l>r)
return 0;
if(lazy[x])pushdown(x);
return query(x*2,l,r)+query(x*2+1,l,r);
}
int main()
{
long long n,m,x,y,z,t;
cin>>n>>m;
for(long long i=1;i<=n;i++)
scanf("%lld",&a[i]);
bt(1,1,n);
for(long long i=1;i<=m;i++)
{
scanf("%lld%lld%lld",&t,&x,&y);
if(t==1)
{
scanf("%lld",&z);
update(1,x,y,z);
}
else cout<<query(1,x,y)<<endl;
}

return 0;
}

原文地址:https://www.cnblogs.com/647Z/p/7354734.html