Wangbingxiang @ 2024-09-20 21:38:50
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000010;
int a[maxn + 2];
struct tree {
int l, r, tag;
long long pre, add, co;
} t[4 * maxn + 2];
void bulid(int p, int l, int r) {
t[p].l = l;
t[p].r = r;
if (l == r) {
t[p].pre = a[l];
return;
}
int mid = (l+r) >> 1;
bulid(p * 2, l, mid);
bulid(p * 2 + 1, mid + 1, r);
t[p].pre = max(t[p * 2].pre , t[p * 2 + 1].pre);
}
void cover(int p) {
if (t[p].tag) {
t[p * 2].pre = t[p * 2 + 1].pre = t[p].co;
t[p * 2].co = t[p * 2 + 1].co = t[p].co;
t[p * 2].tag = t[p * 2 + 1].tag = 1;
t[p].co = 0;
t[p].tag = 0;
}
}
void spread(int p) {
if (t[p].add) {
t[p * 2].pre += t[p].add;
t[p * 2 + 1].pre += t[p].add;
t[p * 2].add += t[p].add;
t[p * 2 + 1].add += t[p].add;
t[p].add = 0;
}
}
void change1(int p, int x, int y, int z) {
if (x <= t[p].l && y >= t[p].r) {
t[p].pre += (long long)z;
t[p].add += z;
return;
}
spread(p);
int mid = (t[p].l+t[p].r) >> 1;
if (x <= mid) change1(p * 2, x, y, z);
if (y > mid) change1(p * 2 + 1, x, y, z);
t[p].pre = max(t[p * 2].pre , t[p * 2 + 1].pre);
}
void change2(int p, int x, int y, int z) {
if (x <= t[p].l && y >= t[p].r) {
t[p].pre = (long long)z;
t[p].co = z;
t[p].tag = 1;
return;
}
cover(p);
int mid = (t[p].l+t[p].r) >> 1;
if (x <= mid) change2(p * 2, x, y, z);
if (y > mid) change2(p * 2 + 1, x, y, z);
t[p].pre = max(t[p * 2].pre , t[p * 2 + 1].pre);
}
long long ask(int p, int x, int y) {
if (x <= t[p].l && y >= t[p].r) return t[p].pre;
spread(p);
cover(p);
int mid = (t[p].l+t[p].r) >> 1;
long long ans = 0;
if (x <= mid) ans = max(ask(p * 2, x, y),ans);
if (y > mid) ans = max(ask(p * 2 + 1, x, y),ans);
return ans;
}
int main() {
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
bulid(1, 1, n);
for (int i = 1; i <= m; i++) {
int q, x, y, z;
scanf("%d", &q);
if (q == 2) {
scanf("%d%d%d", &x, &y, &z);
change1(1, x, y, z);
} else if (q == 1) {
scanf("%d%d%d", &x, &y, &z);
change2(1, x, y, z);
} else if (q == 3) {
scanf("%d%d", &x, &y);
cout << ask(1, x, y) << endl;
}
}
return 0;
}