046.线段树模板
模板
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
ll a[N];
ll sum[N<<2];
ll add[N<<2];
ll cha[N<<2];
bool need[N<<2];
void up(int x){
sum[x]=sum[x<<1]+sum[x<<1|1];
}
void built(int x,int l,int r){
if(l==r){
sum[x]=a[l];
}
else{
int mid=(l+r)>>1;
built(x<<1,l,mid);
built(x<<1|1,mid+1,r);
up(x);
}
add[x]=0;
need[x]=0;
}
void lazy_add(int x,ll k,int siz){
sum[x]+=k*siz;
add[x]+=k;
}
void lazy_change(int x,ll k,int siz){
add[x]=0;
sum[x]=k*siz;
need[x]=1;
cha[x]=k;
}
void down(int x,int ln,int rn){
if(need[x]){
lazy_change(x<<1,cha[x],ln);
lazy_change(x<<1|1,cha[x],rn);
need[x]=0;
}
if(add[x]){
lazy_add(x<<1,add[x],ln);
lazy_add(x<<1|1,add[x],rn);
add[x]=0;
}
}
ll query(int x,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return sum[x];
int mid=(l+r)>>1;
down(x,mid-l+1,r-mid);
ll ans=0;
if(ql<=mid)ans+=query(x<<1,l,mid,ql,qr);
if(qr>mid)ans+=query(x<<1|1,mid+1,r,ql,qr);
return ans;
}
void change(int x,int l,int r,int ql,int qr,ll k){
if(ql<=l&&r<=qr){
lazy_change(x,k,r-l+1);
return;
}
int mid=(l+r)>>1;
down(x,mid-l+1,r-mid);
if(ql<=mid)change(x<<1,l,mid,ql,qr,k);
if(qr>mid)change(x<<1|1,mid+1,r,ql,qr,k);
up(x);
}
void ADD(int x,int l,int r,int ql,int qr,ll k){
if(ql<=l&&r<=qr){
lazy_add(x,k,r-l+1);
return;
}
int mid=(l+r)>>1;
down(x,mid-l+1,r-mid);
if(ql<=mid)ADD(x<<1,l,mid,ql,qr,k);
if(qr>mid)ADD(x<<1|1,mid+1,r,ql,qr,k);
up(x);
}
void solve(){
int n,m,op,l,r;
ll k;
cin>>n>>m;
for(int i=1;i<=n;++i)cin>>a[i];
built(1,1,n);
while(m--){
cin>>op;
if(op==1){
cin>>l>>r>>k;
ADD(1,1,n,l,r,k);
}
if(op==2){
cin>>l>>r;
cout<<query(1,1,n,l,r)<<'\n';
}
}
}
int main(void){
cin.tie(0)->sync_with_stdio(0);
int T=1;
//cin>>T;
while(T--)solve();
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+5;
ll a[N];
ll Max[N<<2];
ll add[N<<2];
ll cha[N<<2];
bool need[N<<2];
void up(int x){
Max[x]=max(Max[x<<1],Max[x<<1|1]);
}
void built(int x,int l,int r){
if(l==r){
Max[x]=a[l];
}
else{
int mid=(l+r)>>1;
built(x<<1,l,mid);
built(x<<1|1,mid+1,r);
up(x);
}
add[x]=0;
need[x]=0;
}
void lazy_add(int x,ll k){
Max[x]+=k;
add[x]+=k;
}
void lazy_change(int x,ll k){
add[x]=0;
Max[x]=k;
need[x]=1;
cha[x]=k;
}
void down(int x){
if(need[x]){
lazy_change(x<<1,cha[x]);
lazy_change(x<<1|1,cha[x]);
need[x]=0;
}
if(add[x]){
lazy_add(x<<1,add[x]);
lazy_add(x<<1|1,add[x]);
add[x]=0;
}
}
ll query(int x,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return Max[x];
int mid=(l+r)>>1;
down(x);
ll ans=LONG_LONG_MIN;
if(ql<=mid)ans=max(ans,query(x<<1,l,mid,ql,qr));
if(qr>mid)ans=max(ans,query(x<<1|1,mid+1,r,ql,qr));
return ans;
}
void change(int x,int l,int r,int ql,int qr,ll k){
if(ql<=l&&r<=qr){
lazy_change(x,k);
return;
}
int mid=(l+r)>>1;
down(x);
if(ql<=mid)change(x<<1,l,mid,ql,qr,k);
if(qr>mid)change(x<<1|1,mid+1,r,ql,qr,k);
up(x);
}
void ADD(int x,int l,int r,int ql,int qr,ll k){
if(ql<=l&&r<=qr){
lazy_add(x,k);
return;
}
int mid=(l+r)>>1;
down(x);
if(ql<=mid)ADD(x<<1,l,mid,ql,qr,k);
if(qr>mid)ADD(x<<1|1,mid+1,r,ql,qr,k);
up(x);
}
void solve(){
int n,m,op,l,r;
ll k;
cin>>n>>m;
for(int i=1;i<=n;++i)cin>>a[i];
built(1,1,n);
while(m--){
cin>>op;
if(op==1){
cin>>l>>r>>k;
change(1,1,n,l,r,k);
}
if(op==2){
cin>>l>>r>>k;
ADD(1,1,n,l,r,k);
}
if(op==3){
cin>>l>>r;
cout<<query(1,1,n,l,r)<<'\n';
}
}
}
int main(void){
cin.tie(0)->sync_with_stdio(0);
int T=1;
//cin>>T;
while(T--)solve();
}
I am the bone of my sword

浙公网安备 33010602011771号