为啥开了优化就RE了啊?!
查看原帖
为啥开了优化就RE了啊?!
607705
__ikun__horro__楼主2022/12/26 20:48
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, m, op, x, y, k, a[100005];
struct node {
	int l, r, w, tag;
} tr[400005];
inline bool inrange(int l1, int r1, int l2, int r2) {
	return (l1 >= l2) && (r1 <= r2);
}
inline bool outofrange(int l1, int r1, int l2, int r2) {
	return (l1 > r2) || (l2 > r1);
}
inline void pushup(int u) {
	tr[u].w = tr[u * 2].w + tr[u * 2 + 1].w;
}
inline void build(int u, int l, int r) {
	if (l == r) {
		tr[u].w = a[l];
		return;
	}
	int mid = l + r >> 1;
	build(u * 2, l, mid); build(u * 2 + 1, mid + 1, r);
	pushup(u);
}
inline int query1(int u, int l, int r, int p) {
	if (l == r) {
		return tr[u].w;
	} else {
		int mid = l + r >> 1;
		if (p <= mid) return query1(u * 2, l, mid, p);
		else return query1(u * 2 + 1, mid + 1, r, p);
	}
}
inline void update1(int u, int l, int r, int p, int x) {
	if (l == r) {
		tr[u].w = x;
	} else {
		int mid = l + r >> 1;
		if (mid >= p) update1(u * 2, l, mid, p, x);
		else update1(u * 2 + 1, mid + 1, r, p, x);
	}
}
inline void maketag(int u, int len, int x) {
	tr[u].tag += x;
	tr[u].w += len * x;
}
inline void pushdown(int u, int l, int r) {
	int mid = l + r >> 1;
	maketag(u * 2, mid - l + 1, tr[u].tag);
	maketag(u * 2 + 1, r - mid, tr[u].tag);
	tr[u].tag = 0;
}
inline int query(int u, int l1, int r1, int l2, int r2) {
	if (inrange(l1, r1, l2, r2)) {
		return tr[u].w;
	} else if (!outofrange(l1, r1, l2, r2)) {
		int mid = l1 + r1 >> 1;
		pushdown(u, l1, r1);
		return query(u * 2, l1, mid, l2, r2) + query(u * 2 + 1, mid + 1, r1, l2, r2);
	}
}
inline void update(int u, int l1, int r1, int l2, int r2, int x) {
	if (inrange(l1, r1, l2, r2)) {
		maketag(u, r1 - l1 + 1, x);
	} else if (!outofrange(l1, r1, l2, r2)) {
		int mid = l1 + r1 >> 1;
		pushdown(u, l1, r1);
		update(u * 2, l1, mid, l2, r2, x);
		update(u * 2 + 1, mid + 1, r1, l2, r2, x);
		pushup(u);
	}
}
signed main() {
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	build(1, 1, n);
	for (int i = 1; i <= m; i++) {
		cin >> op >> x >> y;
		if (op == 1) {
			cin >> k;
			update(1, 1, n, x, y, k);
		} else {
			cout << query(1, 1, n, x, y) << "\n";
		}
	}
}
2022/12/26 20:48
加载中...