#include<bits/stdc++.h>
#define int long long
#define inf 1e15
using namespace std;
const int maxn=1000010;
int n,q;
int a[maxn],t[maxn<<2],lazy[maxn<<2],lazy2[maxn<<2];
inline int read()
{
int x = 0,f = 1;
char ch = getchar();
while(ch < '0' || ch > '9')
{
if(ch == '-')f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9')
{
x = x*10+(ch-'0');
ch = getchar();
}
return x*f;
}
inline void Pushup(int k)
{
t[k] = max(t[k<<1], t[k<<1|1]);
}
inline void Pushdown2(int k)
{
if(lazy2[k]!=-1145141919810)
{
lazy[k<<1] = lazy[k<<1|1] = 0;
lazy2[k<<1] = lazy2[k];
lazy2[k<<1|1] = lazy2[k];
t[k<<1] = lazy2[k];
t[k<<1|1] = lazy2[k];
lazy2[k] = -1145141919810;
}
}
inline void Pushdown(int k)
{
if(lazy[k])
{
Pushdown2(k);
lazy[k<<1] += lazy[k];
lazy[k<<1|1] += lazy[k];
t[k<<1] += lazy[k];
t[k<<1|1] += lazy[k];
lazy[k] = 0;
}
}
void build(int k,int l,int r)
{
if(l == r)
{
lazy[k] = 0;
lazy2[k] = -1145141919810;
t[k] = a[l];
}
else
{
int m = (l+r)>>1;
build(k<<1,l,m);
build(k<<1|1,m+1,r);
Pushup(k);
}
}
inline void updata(int L,int R,int v,int l,int r,int k)
{
if(L <= l && r <= R)
{
Pushdown2(k);
t[k] += v,lazy[k] += v;
return;
}
else
{
Pushdown2(k);
Pushdown(k);
int m = (l+r)>>1;
if(L <= m)
updata(L,R,v,l,m,k<<1);
if(R > m)
updata(L,R,v,m+1,r,k<<1|1);
Pushup(k);
}
}
inline void updata2(int L,int R,int v,int l,int r,int k)
{
if(L <= l && r <= R)
{
lazy[k] = 0;
t[k] = v,lazy2[k] = v;
return;
}
else
{
Pushdown2(k);
Pushdown(k);
int m = (l+r)>>1;
if(L <= m)
updata2(L,R,v,l,m,k<<1);
if(R > m)
updata2(L,R,v,m+1,r,k<<1|1);
Pushup(k);
}
}
inline int query(int L,int R,int l,int r,int k)
{
if(L <= l && r <= R)return t[k];
else
{
Pushdown2(k);
Pushdown(k);
int res = -inf;
int m = (l+r)>>1;
if(L <= m)
res = max(res, query(L,R,l,m,k<<1));
if(R > m)
res = max(res, query(L,R,m+1,r,k<<1|1));
return res;
}
}
signed main()
{
n = read(),q = read();
for(int i=1;i<=n;i++)
{
a[i] = read();
}
build(1,1,n);
for(int i=1;i<=n<<2;i++)lazy2[i]=-1145141919810;
while(q--)
{
int op,l,r,x;
op = read(),l = read(),r = read();
if(op == 1)
{
x = read();
updata2(l,r,x,1,n,1);
}
if(op == 2)
{
x = read();
updata(l,r,x,1,n,1);
}
if(op == 3)
{
printf("%lld\n",query(l,r,1,n,1));
}
}
return 0;
}
题目