烂了烂了
#include <bits/stdc++.h>
using namespace std;
#define error_not_found -1428571428571428ll
#define inf 10000000000000011ll
using lint = long long;
vector<lint> a, tree, lazy, numl;
void push_up(int u) {
tree[u] = max(tree[u << 1], tree[u << 1 | 1]);
return ;
}
void build(int L, int R, int rec) {
numl[rec] = inf;
if (L == R) {
tree[rec] = a[L];
return;
}
int mid = L + ((R - L) >> 1);
build(L, mid, rec << 1);
build(mid + 1, R, rec << 1 | 1);
push_up(rec);
return ;
}
int query_ele(int p, int rec, int L, int R) {
if (L == R) {
return tree[rec];
}
int mid = L + ((R - L) >> 1);
if (mid >= p) {
return query_ele(p, rec << 1, L, mid);
} else {
return query_ele(p, rec << 1 | 1, mid + 1, R);
}
}
bool inrange(int l, int r, int L, int R) {
return ((L <= l) && (R >= r));
}
bool outofrange(int l, int r, int L, int R) {
return ((R < l) || (L > r));
}
void apply2(int u, lint x) {
if (numl[u] != inf) {
numl[u] += x;
} else {
lazy[u] += x;
}
tree[u] += x;
}
void apply1(int u, lint x) {
lazy[u] = 0;
tree[u] = x;
numl[u] = x;
}
void push_down(int rec) {
if (numl[rec] != inf) {
// int mid = L + ((R - L) >> 1);
apply1(rec << 1, numl[rec]);
apply1(rec << 1 | 1, numl[rec]);
numl[rec] = inf;
}
if (lazy[rec] != 0) {
// int mid = L + ((R - L) >> 1);
apply2(rec << 1, lazy[rec]);
apply2(rec << 1 | 1, lazy[rec]);
lazy[rec] = 0;
}
}
lint query_interv(int l, int r, int p, int L, int R) {
if (inrange(l, r, L, R)) {
return tree[p];
} else if (!outofrange(l, r, L, R)) {
int mid = l + ((r - l) >> 1);
push_down(p);
return max(query_interv(l, mid, p << 1, L, R),
query_interv(mid + 1, r, p << 1 | 1, L, R));
} else return error_not_found;
}
void add_interv(int l, int r, int p, int L, int R, lint x) {
if (inrange(l, r, L, R)) {
apply2(p, x);
return ;
} else if (!outofrange(l, r, L, R)) {
int mid = L + ((R - L) >> 1);
push_down(p);
add_interv(l, r, p << 1, L, mid, x) ;
add_interv(l, r, p << 1 | 1, mid + 1, R, x) ;
push_up(p);
}
}
void fix_interv(int l, int r, int p, int L, int R, lint x) {
if (inrange(l, r, L, R)) {
apply1(p, x);
return ;
} else if (!outofrange(l, r, L, R)) {
int mid = L + ((R - L) >> 1);
push_down(p);
fix_interv(l, r, p << 1, L, mid, x) ;
fix_interv(l, r, p << 1 | 1, mid + 1, R, x) ;
push_up(p);
}
}
int main() {
int n, q;
cin >> n >> q;
a.resize(n + 2);
tree.resize(4 * n + 1);
lazy.resize(4 * n + 1);
numl.resize(4 * n + 1);
for (int i = 1 ; i <= n ; i ++) {
cin >> a[i];
}
build(1, n, 1);
while (q --) {
int opt;
cin >> opt;
if (opt == 1) {
int x, y, z;
cin >> x >> y >> z;
fix_interv(x, y, 1, 1, n, z);
} else if (opt == 2) {
int x, y, z;
cin >> x >> y >> z;
add_interv(x, y, 1, 1, n, z);
} else {
int x, y;
cin >> x >> y;
cout << query_interv(x, y, 1, 1, n) << '\n';
}
// for(int i = 1 ; i <= 2 * n - 1 ; i ++){
// cout << tree[i] << " ";
// }
// cout << "\n---------------\n";
}
return 0;
}