样例过了AC#2 其余全WA求调
查看原帖
样例过了AC#2 其余全WA求调
1074696
tmlrock楼主2025/8/29 20:14
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using uint = unsigned;
ll val[1 << 20];
ll add[1 << 20];
uint n, q, m, x, y, z;
#define root 0
inline ll query(uint l, uint r) {
	ll ans(0);
	uint siz = 1;
	uint lsiz(0), rsiz(0);
	for (l = n + l - 1, r = n + r + 1; l ^ r ^ 1; r >>= 1, l >>= 1, siz <<= 1) {
		if (~l & 1) {
			ans += val[l ^ 1];
			lsiz += siz;
		}
		if (r & 1) {
			ans += val[r ^ 1];
			rsiz += siz;
		}
		if (add[l])ans += add[l] * lsiz;
		if (add[r])ans += add[r] * rsiz;
	}
	for (; l; l >>= 1, r >>= 1) {
		if (add[l])ans += add[l] * lsiz;
		if (add[r])ans += add[r] * rsiz;
	}
	return ans;
}
inline void modify(uint l, uint r, ll d) {
	uint siz = 1;
	uint lsiz(0), rsiz(0);
	for (l = n + l - 1, r = n + r + 1; l ^ r ^ 1; r >>= 1, l >>= 1, siz <<= 1) {
		if (~l & 1) {
			add[l ^ 1] += d;
			val[l ^ 1] += siz * d;
			lsiz += siz;
		}
		if (r & 1) {
			add[r ^ 1] += d;
			val[r ^ 1] += siz * d;
			rsiz += siz;
		}
	}
	for (; l; l >>= 1, r >>= 1) {
		val[l ^ 1] += lsiz * d;
		val[r ^ 1] += rsiz * d;
	}
}
inline void init(uint n_) {
	memset(add, 0, sizeof add);
	memset(val, 0, sizeof val);
	for (n = 1; n <= n_ + 1; n <<= 1);
	for (uint i = 1; i <= n_; ++i)cin >> val[i | n];
	for (uint i = n; i; --i)val[i] = val[i << 1] + val[(i << 1) | 1];
}
int main() {
	cin >> m >> q;
	init(m);
	while (cin >> q >> x >> y) {
		if (q == 1) {
			cin >> z;
			modify(x, y, z);
		} else cout << query(x, y) << '\n';
	}
	return 0;
}
2025/8/29 20:14
加载中...