mxqz线段树
查看原帖
mxqz线段树
560516
喵仔牛奶楼主2022/11/4 21:18

https://www.luogu.com.cn/record/92802532

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 5;
ll n, q, opt, l, r, k, a[N], sum[N << 2], tag[N << 2], ass[N << 2], qwq[N << 1];
inline int ls(int p) { return p << 1; }
inline int rs(int p) { return p << 1 | 1; }
inline void push_up(int p) {
	sum[p] = max(sum[ls(p)], sum[rs(p)]);
}
void build(int p, int l, int r) {
	if (l == r) { sum[p] = a[l]; return; }
	int mid = (l + r) >> 1;
	build(ls(p), l, mid), build(rs(p), mid + 1, r);
	push_up(p);
}
inline void push_tag(int p, int fa) {
	if (qwq[fa]) sum[p] = ass[fa];
	tag[p] += tag[fa], sum[p] += tag[fa];
}
inline void push_down(int p) {
	push_tag(ls(p), p), push_tag(rs(p), p), tag[p] = qwq[p] = 0;
}
inline void modify(int p, int nl, int nr, int l, int r, ll k) {
	push_down(p);
	if (nl <= l && r <= nr) {
		tag[p] += k, sum[p] += k; 
		return;
	}
	int mid = (l + r) >> 1;
	if (nl <= mid) modify(ls(p), nl, nr, l, mid, k);
	if (nr > mid) modify(rs(p), nl, nr, mid + 1, r, k);
	push_up(p);
}
inline void assign(int p, int nl, int nr, int l, int r, ll k) {
	push_down(p);
	if (nl <= l && r <= nr) {
		qwq[p] = 1, ass[p] = k, tag[p] = 0, sum[p] = k;
		return;
	}
	int mid = (l + r) >> 1;
	if (nl <= mid) assign(ls(p), nl, nr, l, mid, k);
	if (nr > mid) assign(rs(p), nl, nr, mid + 1, r, k);
	push_up(p);
}
ll query(int p, int nl, int nr, int l, int r) {
	ll res = -LLONG_MAX;
	push_down(p);
	if (nl <= l && r <= nr) return sum[p];
	int mid = (l + r) >> 1;
	if (nl <= mid) res = max(res, query(ls(p), nl, nr, l, mid));
	if (nr > mid) res = max(res, query(rs(p), nl, nr, mid + 1, r));
	return res;
}
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> n >> q;
	for (int i = 1; i <= n; i ++)
		cin >> a[i];
	build(1, 1, n);
	for (int i = 1; i <= q; i ++) {
		cin >> opt >> l >> r;
		if (opt == 1) cin >> k, assign(1, l, r, 1, n, k);
		else if (opt == 2) cin >> k, modify(1, l, r, 1, n, k);
		else cout << query(1, l, r, 1, n) << '\n';
	}
	return 0;
}

2022/11/4 21:18
加载中...