玄关
#include <bits/stdc++.h>
#define Code using
#define by namespace
#define zzx std
#define MINN -0x7fffffffffffffff
Code by zzx;
int n, m;
long long a[1000010];
long long d[4000010], tag1[4000010], tag2[4000010];
void build(int s, int t, int p)
{
tag2[p] = MINN;
if(s == t)
{
d[p] = a[s];
return;
}
int mid = (s + t) >> 1;
build(s, mid, p * 2), build(mid + 1, t, p * 2 + 1);
d[p] = max(d[p * 2], d[p * 2 + 1]);
}
void coverdown(int s, int t, int p)
{
if(tag2[p] != MINN)
{
tag1[p * 2] = 0, tag1[p * 2 + 1] = 0;
tag2[p * 2] = tag2[p], tag2[p * 2 + 1] = tag2[p];
d[p * 2] = tag2[p], d[p * 2 + 1] = tag2[p];
tag2[p] = MINN;
}
}
void adddown(int s, int t, int p)
{
if(tag1[p])
{
coverdown(s, t, p);
tag1[p * 2] += tag1[p], tag1[p * 2 + 1] += tag1[p];
d[p * 2] += tag1[p], d[p * 2 + 1] += tag1[p];
tag1[p] = 0;
}
}
void pushdown(int s, int t, int p)
{
coverdown(s, t, p); adddown(s, t, p);
}
void update1(int s, int t, int l, int r, long long k, int p)
{
//cout << s << ' ' << t << ' ' << l << ' ' << r << ' ' << p << ' ' << d[p] << '\n';
if(l <= s && t <= r)
{
coverdown(s, t, p);
d[p] += k, tag1[p] += k;
return;
}
pushdown(s, t, p);
int mid = (s + t) >> 1;
if(l <= mid) update1(s, mid, l, r, k, p * 2);
if(mid < r) update1(mid + 1, t, l, r, k, p * 2 + 1);
d[p] = max(d[p * 2], d[p * 2 + 1]);
}
void update2(int s, int t, int l, int r, long long k, int p)
{
//cout << s << ' ' << t << ' ' << l << ' ' << r << ' ' << p << ' ' << d[p] << '\n';
if(l <= s && t <= r)
{
d[p] = k, tag1[p] = 0, tag2[p] = k;
return;
}
pushdown(s, t, p);
int mid = (s + t) >> 1;
if(l <= mid) update2(s, mid, l, r, k, p * 2);
if(mid < r) update2(mid + 1, t, l, r, k, p * 2 + 1);
d[p] = max(d[p * 2], d[p * 2 + 1]);
}
long long query(int s, int t, int l, int r, int p)
{
//cout << s << ' ' << t << ' ' << l << ' ' << r << ' ' << p << ' ' << d[p] << '\n';
if(l <= s && t <= r) return d[p];
pushdown(s, t, p);
int mid = (s + t) >> 1;
long long res = MINN;
if(l <= mid) res = max(res, query(s, mid, l, r, p * 2));
if(mid < r) res = max(res, query(mid + 1, t, l, r, p * 2 + 1));
return res;
}
int main()
{
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> m;
for(int i = 1; i <= n; ++i)
{
cin >> a[i];
}
build(1, n, 1);
while(m--)
{
int opt, l, r;
long long x;
cin >> opt >> l >> r;
if(opt == 1)
{
cin >> x;
update2(1, n, l, r, x, 1);
}
else if(opt == 2)
{
cin >> x;
update1(1, n, l, r, x, 1);
}
else cout << query(1, n, l, r, 1) << '\n';
}
return 0;
}