代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 5;
const int inf = 1e18;
int n, m;
int a[N];
int tree[N * 4], tag1[N * 4], tag2[N * 4];
void pushup(int node){
tree[node] = max(tree[node << 1], tree[node << 1 | 1]);
}
void addtag1(int node, int lt, int rt, int val){ //赋值
tag1[node] = val;
tag2[node] = 0;
tree[node] = val;
}
void addtag2(int node, int lt, int rt, int val){
tag2[node] += val;
tree[node] += (rt - lt + 1) * val;
}
void pushdown(int node, int lt, int rt){
// if(!tag1[node] && !tag2[node]){
// return ;
// }
int mid = lt + rt >> 1;
if(tag1[node] != inf){
addtag1(node << 1, lt, mid, tag1[node]);
addtag1(node << 1 | 1, mid + 1, rt, tag1[node]);
tag1[node] = inf;
}
if(tag2[node]){
addtag2(node << 1, lt, mid, tag2[node]);
addtag2(node << 1 | 1, mid + 1, rt, tag2[node]);
tag2[node] = 0;
}
}
void build(int node, int lt, int rt){
if(lt == rt){
tree[node] = a[lt];
return ;
}
int mid = lt + rt >> 1;
build(node << 1, lt, mid);
build(node << 1 | 1, mid + 1, rt);
pushup(node);
}
void update1(int node, int lt, int rt, int x, int y, int val){ //赋值
if(x > rt || y < lt){
return ;
}
if(x <= lt && rt <= y){
addtag1(node, lt, rt, val);
return ;
}
pushdown(node, lt, rt);
int mid = lt + rt >> 1;
update1(node << 1, lt, mid, x, y, val);
update1(node << 1 | 1, mid + 1, rt, x, y, val);
pushup(node);
}
void update2(int node, int lt, int rt, int x, int y, int val){ //赋值
if(x > rt || y < lt){
return ;
}
if(x <= lt && rt <= y){
addtag2(node, lt, rt, val);
return ;
}
pushdown(node, lt, rt);
int mid = lt + rt >> 1;
update2(node << 1, lt, mid, x, y, val);
update2(node << 1 | 1, mid + 1, rt, x, y, val);
pushup(node);
}
int query(int node, int lt, int rt, int x, int y){ //赋值
if(x > rt || y < lt){
return -1e18;
}
if(x <= lt && rt <= y){
return tree[node];
}
pushdown(node, lt, rt);
int mid = lt + rt >> 1;
return max(query(node << 1, lt, mid, x, y), query(node << 1 | 1, mid + 1, rt, x, y));
}
void Solve(){
cin >> n >> m;
for(int i = 1; i <= n; i++){
cin >> a[i];
}
build(1, 1, n);
for(int i = 1; i <= 4 * n; i++){
tag1[i] = inf;
}
while(m--){
int op;
cin >> op;
if(op == 1){
int x, y, k;
cin >> x >> y >> k;
update1(1, 1, n, x, y, k);
}
else if(op == 2){
int x, y, k;
cin >> x >> y >> k;
update2(1, 1, n, x, y, k);
}
else{
int x, y;
cin >> x >> y;
cout << query(1, 1, n, x, y) << '\n';
}
}
}
signed main(){
Solve();
return 0;
}
更奇妙的是,最后一个点开 O2 都 T 了。