Pangding @ 2024-02-20 16:49:31
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[100010];
struct tree {
int value;
int lazytag,lazytag2;//tag2直接修改;
int havecover;
int l,r;
} tree[500010];
void pushdown(int k) {
int mid=(tree[k].l+tree[k].r)>>1;
if(!tree[k].havecover){
tree[k*2].value+=tree[k].lazytag,tree[k*2+1].value+=tree[k].lazytag;
if(tree[k*2].havecover){
tree[k*2].lazytag2+=tree[k].lazytag;
tree[k*2].lazytag+=tree[k].lazytag;
}
if(tree[k*2+1].havecover){
tree[k*2+1].lazytag2+=tree[k].lazytag;
tree[k*2+1].lazytag+=tree[k].lazytag;
}
}
if(tree[k].havecover){
tree[k*2].value=tree[k*2+1].value=tree[k].lazytag2;
tree[k*2].havecover=tree[k*2+1].havecover=1;
tree[k*2].lazytag2=tree[k*2+1].lazytag2=tree[k].lazytag2;
tree[k*2].lazytag=tree[k*2+1].lazytag=0;
}
tree[k].lazytag=0;
tree[k].havecover=0;
tree[k].lazytag2=0;
}
void build(int k,int l,int r) {
tree[k].l=l;
tree[k].r=r;
if(l==r) {
tree[k].value=a[l];
return;
}
int mid=(l+r)>>1;
build(k*2,l,mid);
build(k*2+1,mid+1,r);
tree[k].value=max(tree[k*2].value,tree[k*2+1].value);
}
void update(int k,int l,int r,int v) {
if(tree[k].l==l&&tree[k].r==r) {
tree[k].value+=v;
tree[k].lazytag+=v;
if(tree[k].havecover)
tree[k].lazytag2+=v;
return;
}
pushdown(k);
int mid=(tree[k].l+tree[k].r)>>1;
if(r<=mid) {
update(k*2,l,r,v);
} else if(l>mid) {
update(k*2+1,l,r,v);
} else {
update(k*2,l,mid,v);
update(k*2+1,mid+1,r,v);
}
tree[k].value=max(tree[k*2].value,tree[k*2+1].value);
}
void update2(int k,int l,int r,int v) {
if(tree[k].l==l&&tree[k].r==r) {
tree[k].value=v;
tree[k].lazytag=0;
tree[k].lazytag2=v;
tree[k].havecover=1;
return;
}
pushdown(k);
int mid=(tree[k].l+tree[k].r)>>1;
if(r<=mid) {
update(k*2,l,r,v);
} else if(l>mid) {
update(k*2+1,l,r,v);
} else {
update(k*2,l,mid,v);
update(k*2+1,mid+1,r,v);
}
tree[k].value=max(tree[k*2].value,tree[k*2+1].value);
}
int query(int k,int l,int r) {
if(l==tree[k].l&&r==tree[k].r) {
return tree[k].value;
}
int mid=(tree[k].l+tree[k].r)>>1;
pushdown(k);
if(r<=mid) {
return query(k*2,l,r);
} else if(l>mid) {
return query(k*2+1,l,r);
} else {
return query(k*2,l,mid)+query(k*2+1,mid+1,r);
}
}
signed main() {
int n,m;
cin>>n>>m;
for(int i=1; i<=n; i++) {
cin>>a[i];
}
build(1,1,n);
while(m--) {
int a,b,c,d;
cin>>a>>b>>c;
if(a==1) {
cin>>d;
update2(1,b,c,d);
} else {
if(a==2) {
cin>>d;
update(1,b,c,d);
} else {
cout<<query(1,b,c);
}
}
}
return 0;
}