样例过WA0pts,悬赏关注* 1
查看原帖
样例过WA0pts,悬赏关注* 1
1036180
ChampionCyan楼主2024/4/10 21:14
#include <bits/stdc++.h>
using namespace std;

long long a[1000001];

class segtree {
	private:
		long long tree[4000004];
		long long lazy[4000004];
		inline long long lcp(long long p) {
			return p << 1;
		}
		inline long long rcp(long long p) {
			return (p << 1) + 1;
		}
		inline void push_up(long long p) {
			tree[p] = tree[lcp(p)] + tree[rcp(p)];
		}
		inline void f(long long p, long long l, long long r, long long k) {
			lazy[p] += k;
			tree[p] += k * (r - l + 1);
		}
	public:
		void init(long long p, long long l, long long r, long long *arr) {
			if (l == r) {
				tree[p] = arr[l];
				return;
			}
			long long mid = (l + r) >> 1;
			init(lcp(p), l, mid, arr), init(rcp(p), mid + 1, r, arr), push_up(p);
		}
		void add(long long p, long long l, long long r, long long &al, long long &ar, long long &k) {
			if (l == r) {
				tree[p] += k;
				return;
			}
			if (lazy[p]) {
				long long &lp = lazy[p];
				tree[lcp(p)] += lp, tree[rcp(p)] += lp, lazy[lcp(p)] += lp, lazy[rcp(p)] += lp;
				lp = 0;
			}
			if (al <= l and ar >= r) {
				tree[p] += k, lazy[p] += k;
				return;
			}
			long long mid = (l + r) >> 1;
			if (al <= mid)
				add(lcp(p), l, mid, al, ar, k);
			if (ar > mid)
				add(rcp(p), mid + 1, r, al, ar, k);
			push_up(p);
		}
		long long get(long long p, long long l, long long r, long long &al, long long &ar) {
			if (al <= l and r <= ar)
				return tree[p];
			if (lazy[p]) {
				long long mid = (l + r) >> 1;
				f(lcp(p), l, mid, lazy[p]);
				f(rcp(p), mid + 1, r, lazy[p]);
			}
			long long mid = (l + r) >> 1;
			long long ans = 0;
			if (al <= mid)
				ans += get(lcp(p), l, mid, al, ar);
			if (ar > mid)
				ans += get(rcp(p), mid + 1, r, al, ar);
			return ans;
		}
} stree;

int main() {
	long long n, m;
	scanf("%lld%lld", &n, &m);
	for (long long i = 1; i <= n; i++)
		scanf("%lld", a + i);
	stree.init(1, 1, n, a);
	while (m--) {
		long long op;
		scanf("%lld", &op);
		if (op == 1) {
			long long x, y;
			long long k;
			scanf("%lld%lld%lld", &x, &y, &k);
			stree.add(1, 1, n, x, y, k);
		} else {
			long long x, y;
			scanf("%lld%lld", &x, &y);
			printf("%lld\n", stree.get(1, 1, n, x, y));
		}
	}
	return 0;
}
2024/4/10 21:14
加载中...