CSES - Shared codeLink to this code:
https://cses.fi/paste/f96e5180d71d33451f11d0/
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
# define l2 log2
# define ll long long int
# define mm 1000000007
# define pb push_back
struct vertex{
bool lazy=false;
ll sum;
int v=-1;
int val=0;
};
vertex st[int(1e6)];
void fastIO() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
}
void applyincr(int ind,ll val,int s,int e){
st[ind].sum+=(e-s+1)*val;
if(s!=e){
st[ind].lazy=true;
st[ind].val+=val;
}
}
void applyupd(int ind ,ll val,int s,int e){
st[ind].sum=(e-s+1)*val;
if(s!=e){
st[ind].lazy=true;
st[ind].v=val;
st[ind].val=0;
}
}
void push(int ind,int s,int e){
if(st[ind].lazy){
int mid=(s+e)/2;
if(st[ind].v!=-1){
applyupd(ind*2+1,st[ind].v+st[ind].val,s,mid);
applyupd(ind*2+2,st[ind].v+st[ind].val,mid+1,e);
}
else if(st[ind].val!=0){
applyincr(ind*2+1,st[ind].val,s,mid);
applyincr(ind*2+2,st[ind].val,mid+1,e);
}
st[ind].lazy=false;
st[ind].v=-1;
st[ind].val=0;
}
}
void ud2(int s,int e,int ind,int l,int r,ll val){
if(s==l && e==r){
applyupd(ind,val,s,e);
return;
}
push(ind,s,e);
int mid=(s+e)/2;
if(r<=mid){
ud2(s,mid,ind*2+1,l,r,val);
}else if(l>mid){
ud2(mid+1,e,ind*2+2,l,r,val);
}else{
ud2(s,mid,ind*2+1,l,mid,val);
ud2(mid+1,e,ind*2+2,mid+1,r,val);
}
st[ind].sum=st[ind*2+1].sum+st[ind*2+2].sum;
}
void ud1(int s,int e,int ind,int l,int r,ll val){
if(s==l && e==r){
applyincr(ind,val,s,e);
return;
}
push(ind,s,e);
int mid=(s+e)/2;
if(r<=mid){
ud1(s,mid,ind*2+1,l,r,val);
}else if(l>mid){
ud1(mid+1,e,ind*2+2,l,r,val);
}else{
ud1(s,mid,ind*2+1,l,mid,val);
ud1(mid+1,e,ind*2+2,mid+1,r,val);
}
st[ind].sum=st[ind*2+1].sum+st[ind*2+2].sum;
}
ll query(int s,int e,int ind,int l,int r){
if(s==l && e==r){
return st[ind].sum;
}
push(ind,s,e);
int mid=(s+e)/2;
if(r<=mid){
return query(s,mid,ind*2+1,l,r);
}else if(l>mid){
return query(mid+1,e,ind*2+2,l,r);
}else{
return query(s,mid,ind*2+1,l,mid)+query(mid+1,e,ind*2+2,mid+1,r);
}
}
void build(int s,int e,int ind,ll a[]){
if(s==e){
st[ind].sum=a[s];
return;
}
int mid=(s+e)/2;
build(s,mid,ind*2+1,a);
build(mid+1,e,ind*2+2,a);
st[ind].sum=st[ind*2+1].sum+st[ind*2+2].sum;
return;
}
void solve(){
int n,q;
cin>>n>>q;
ll a[n];
for(ll &i:a){
cin>>i;
}
build(0,n-1,0,a);
for(int i=1;i<=q;i++){
int qt;
cin>>qt;
if(qt==1){
int l,r;ll val;
cin>>l>>r>>val;
l--;r--;
ud1(0,n-1,0,l,r,val);
}else if(qt==2){
int l,r;ll val;
l--;r--;
cin>>l>>r>>val;
ud2(0,n-1,0,l,r,val);
}else{
int l,r;
cin>>l>>r;
l--;r--;
cout<<query(0,n-1,0,l,r)<<endl;
}
}
}
int main(){
fastIO();
// int t;
// cin>>t;
// while(t>0){
solve();
// t--;
// }
return 0;
}