一下是代码,请各位大佬多多指教……
代码风格不太好……
//线段树模板 写于2020年8月5日20:04:09
#include <bits/stdc++.h>
using namespace std;
const long long maxn=800001;
long long sum[maxn],shu[maxn],tep[maxn];
void build(long long l,long long r,long long k)
{
if(l==r)
{
sum[k]=shu[l];return;
}
long long mid=(l+r)/2;
build(l,mid,2*k);build(mid+1,r,2*k+1);
sum[k]=sum[2*k]+sum[2*k+1];
}
void take_tep(long long l,long long r,long long v,long long k)
{
tep[k]=v;
sum[k]+=(r-l+1)*v;
return;
}
void push_down(long long l,long long r,long long k,long long mid)
{
if(tep[k]==0) return;
take_tep(l,mid,tep[k],2*k);
take_tep(mid+1,r,tep[k],2*k+1);
tep[k]=0;
}
long long apd_get(long long l,long long r,long long getl,long long getr,long long k)
{
if(l>=getl&&r<=getr)
{
return sum[k];
}
long long mid=(l+r)/2,cnt=0;
push_down(l,r,k,mid);
if(getl<=mid) cnt+=apd_get(l,mid,getl,getr,2*k);
if(getr>mid) cnt+=apd_get(mid+1,r,getl,getr,2*k+1);
return cnt;
}
void apd_set(long long l,long long r,long long getl,long long getr,long long k,long long v)
{
if(l>=getl&&r<=getr)
{
take_tep(l,r,v,k);return;
}
long long mid=(l+r)/2;
push_down(l,r,k,mid);
if(getl<=mid) apd_set(l,mid,getl,getr,2*k,v);
if(getr>mid) apd_set(mid+1,r,getl,getr,2*k+1,v);
sum[k]=sum[2*k]+sum[2*k+1];
}
int main()
{
long long n,m;cin>>n>>m;
for(long long i=1;i<=n;i++)
{
cin>>shu[i];
}
build(1,n,1);
for(long long i=1;i<=m;i++)
{
long long ppp;cin>>ppp;
if(ppp==1)
{
long long x,y,k;cin>>x>>y>>k;
apd_set(1,n,x,y,1,k);
}
if(ppp==2)
{
long long x,y;cin>>x>>y;
cout<<apd_get(1,n,x,y,1)<<endl;
}
}
}
QWQQWQ!求助!本蒟蒻求助!