线段树60pts求调
查看原帖
线段树60pts求调
1098908
Hacstd楼主2025/2/5 18:15
#include<bits/stdc++.h>
#define int long long
using namespace std;

const int M = 1e6 + 5;
int n, m, a[M], t[M * 4], tag[M * 4];

int ls(int p) { return p << 1; }
int rs(int p) { return p << 1 | 1; }
inline void push_up(int p) { t[p] = max(t[ls(p)], t[rs(p)]); }
inline void change(int p, int l, int r, int k) { t[p] += k, tag[p] += k; }

inline void push_down(int p, int l, int r) {
	if(tag[p]) {
		int mid = (l + r) >> 1;
		change(ls(p), l, mid, tag[p]), change(rs(p), mid + 1, r, tag[p]);
		tag[p] = 0;
	}
}

inline void build(int p, int l, int r) {
	if(l == r) return (void)(t[p] = a[l]);
	int mid = (l + r) >> 1;
	build(ls(p), l, mid), build(rs(p), mid + 1, r);
	push_up(p);
}

inline void update(int l, int r, int p, int pl, int pr, int k, int opt) {
	if(l <= pl && pr <= r) return opt == 1 ? change(p, pl, pr, k - t[p]) : change(p, pl, pr, k);
	push_down(p, pl, pr);
	int mid = (pl + pr) >> 1;
	if(l <= mid) update(l, r, ls(p), pl, mid, k, opt);
	if(mid < r) update(l, r, rs(p), mid + 1, pr, k, opt);
	push_up(p);
}

int qry(int l, int r, int p, int pl, int pr) {
	if(l <= pl && pr <= r) return t[p];
	push_down(p, pl, pr);
	int mid = (pl + pr) >> 1, res = -1e18;
	if(l <= mid) res = max(res, qry(l, r, ls(p), pl, mid));
	if(mid < r) res = max(res, qry(l, r, rs(p), mid + 1, pr));
	return res;
}

signed main() {
//	freopen("in.txt", "r", stdin);
//	freopen("mine.txt", "w", stdout);
	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, 1, n);
	int opt, l, r, x;
	while(m--) {
		cin >> opt >> l >> r;
		if(opt <= 2) cin >> x, update(l, r, 1, 1, n, x, opt);
		if(opt == 3) cout << qry(l, r, 1, 1, n) << "\n";
	}
	return 0;
}
2025/2/5 18:15
加载中...