60pts:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[1000009],n,op,q,x,y,k;
struct tr{
int maxn,laz,l,r,xg = 1e18 + 1;
}tree[4000009];
void pushdown(int id){
if(tree[id].xg != 1e18 + 1){
tree[id * 2 + 1].maxn = tree[id * 2].maxn = tree[id].xg;
tree[id * 2 + 1].xg = tree[id * 2].xg = tree[id].xg;
tree[id].xg = 1e18 + 1;
tree[id * 2].laz = tree[id * 2 + 1].laz = 0;
return;
}
tree[id * 2].maxn += tree[id].laz;
tree[id * 2].laz += tree[id].laz;
tree[id * 2 + 1].maxn += tree[id].laz;
tree[id * 2 + 1].laz += tree[id].laz;
tree[id].laz = 0;
}
void build(int id,int l,int r){
tree[id].l = l,tree[id].r = r;
if(l == r){
tree[id].maxn = a[l];
return;
}
int mid = (l + r) / 2;
build(id * 2,l,mid);
build(id * 2 + 1,mid + 1,r);
tree[id].maxn = max(tree[id * 2].maxn,tree[id * 2 + 1].maxn);
}
int quest(int id,int l,int r){
if(l <= tree[id].l && tree[id].r <= r){
return tree[id].maxn;
}
int mid = (tree[id].l + tree[id].r) / 2,maxx = -1e18;
pushdown(id);
if(l <= mid){
maxx = max(maxx,quest(id * 2,l,r));
}
if(mid + 1 <= r){
maxx = max(maxx,quest(id * 2 + 1,l,r));
}
return maxx;
}
void add(int id,int s,int t,int k){
if(s <= tree[id].l && tree[id].r <= t){
if(tree[id].xg == 1e18 + 1){
tree[id].maxn += k;
tree[id].laz += k;
return;
}
else{
tree[id].xg += k;
tree[id].maxn += k;
return;
}
}
pushdown(id);
int mid = (tree[id].l + tree[id].r) / 2;
if(s <= mid){
add(id * 2,s,t,k);
}
if(mid + 1 <= t){
add(id * 2 + 1,s,t,k);
}
tree[id].maxn = max(tree[id * 2].maxn,tree[id * 2 + 1].maxn);
}
void dda(int id,int s,int t,int k){
if(s <= tree[id].l && tree[id].r <= t){
tree[id].maxn = k;
tree[id].xg = k;
tree[id].laz = 0;
return;
}
pushdown(id);
int mid = (tree[id].l + tree[id].r) / 2;
if(s <= mid){
dda(id * 2,s,t,k);
}
if(mid + 1 <= t){
dda(id * 2 + 1,s,t,k);
}
tree[id].maxn = max(tree[id * 2].maxn,tree[id * 2 + 1].maxn);
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> q;
for(int i = 1;i <= n;i++){
cin >> a[i];
}
build(1,1,n);
while(q--){
cin >> op;
if(op == 1){
cin >> x >> y >> k;
dda(1,x,y,k);
}
else if(op == 2){
cin >> x >> y >> k;
add(1,x,y,k);
}
else{
cin >> x >> y;
cout << quest(1,x,y) << '\n';
}
}
return 0;
}
100pts:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int INF = LLONG_MAX;
int a[1000009], n, op, q, x, y, k;
struct tr {
int maxn, laz, l, r, xg = INF;
} tree[4000009];
void pushdown(int id) {
if (tree[id].xg != INF) {
tree[id * 2].maxn = tree[id * 2 + 1].maxn = tree[id].xg;
tree[id * 2].xg = tree[id * 2 + 1].xg = tree[id].xg;
tree[id * 2].laz = tree[id * 2 + 1].laz = 0;
tree[id].xg = INF;
}
if (tree[id].laz != 0) {
tree[id * 2].maxn += tree[id].laz;
tree[id * 2 + 1].maxn += tree[id].laz;
tree[id * 2].laz += tree[id].laz;
tree[id * 2 + 1].laz += tree[id].laz;
tree[id].laz = 0;
}
}
void build(int id, int l, int r) {
tree[id].l = l, tree[id].r = r;
if (l == r) {
tree[id].maxn = a[l];
return;
}
int mid = (l + r) / 2;
build(id * 2, l, mid);
build(id * 2 + 1, mid + 1, r);
tree[id].maxn = max(tree[id * 2].maxn, tree[id * 2 + 1].maxn);
}
int quest(int id, int l, int r) {
if (l <= tree[id].l && tree[id].r <= r) {
return tree[id].maxn;
}
pushdown(id);
int mid = (tree[id].l + tree[id].r) / 2, maxx = -INF;
if (l <= mid) {
maxx = max(maxx, quest(id * 2, l, r));
}
if (mid + 1 <= r) {
maxx = max(maxx, quest(id * 2 + 1, l, r));
}
return maxx;
}
void add(int id, int s, int t, int k) {
if (s <= tree[id].l && tree[id].r <= t) {
if (tree[id].xg == INF) {
tree[id].maxn += k;
tree[id].laz += k;
} else {
tree[id].xg += k;
tree[id].maxn += k;
}
return;
}
pushdown(id);
int mid = (tree[id].l + tree[id].r) / 2;
if (s <= mid) {
add(id * 2, s, t, k);
}
if (mid + 1 <= t) {
add(id * 2 + 1, s, t, k);
}
tree[id].maxn = max(tree[id * 2].maxn, tree[id * 2 + 1].maxn);
}
void dda(int id, int s, int t, int k) {
if (s <= tree[id].l && tree[id].r <= t) {
tree[id].maxn = k;
tree[id].xg = k;
tree[id].laz = 0;
return;
}
pushdown(id);
int mid = (tree[id].l + tree[id].r) / 2;
if (s <= mid) {
dda(id * 2, s, t, k);
}
if (mid + 1 <= t) {
dda(id * 2 + 1, s, t, k);
}
tree[id].maxn = max(tree[id * 2].maxn, tree[id * 2 + 1].maxn);
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> q;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
build(1, 1, n);
while (q--) {
cin >> op;
if (op == 1) {
cin >> x >> y >> k;
dda(1, x, y, k);
} else if (op == 2) {
cin >> x >> y >> k;
add(1, x, y, k);
} else {
cin >> x >> y;
cout << quest(1, x, y) << '\n';
}
}
return 0;
}
第二份代码是AI改的,感觉逻辑没有区别,每一个不同也都改上了,但是依然60pts,有大佬帮助必关