求助WA了
查看原帖
求助WA了
403452
Dream_Dream楼主2021/11/18 18:49
#include <bits/stdc++.h>
using namespace std;
int n, m;
int a[100010];
struct SegmentTree{
	int l, r;
	long long sum, add;
}t[100010*4];
void build(int p, int l, int r) {
	t[p].l = l, t[p].r = r;
	if (l == r) {
		t[p].sum = a[l];
		return ;
	}
	int mid = (l + r) >> 1;
	build(p*2, l, mid), build(p*2+1, mid+1, r);
	t[p].sum = t[p*2].sum + t[p*2+1].sum;
}
void spread(int p) {
	if (t[p].add) {
		t[p*2].sum += t[p].add*(t[p*2].r - t[p*2].l + 1);
		t[p*2+1].sum += t[p].add*(t[p*2+1].r - t[p*2].l + 1);
		t[p*2].add += t[p].add;
		t[p*2+1].add += t[p].add;
		t[p].add = 0; 
	}
}
void change(int p, int l, int r, int d) {
	if (l <= t[p].l && r >= t[p].r) {
		t[p].sum += (long long)d * (t[p].r - t[p].l + 1);
		t[p].add += d;
		return ;
	}
	spread(p);
	int mid = (t[p].l + t[p].r) >> 1;
	if (l <= mid) change(p*2, l, r, d);
	if (r > mid) change(p*2+1, l, r, d);
	t[p].sum = t[p*2].sum + t[p*2+1].sum;
}
long long ask(int p, int l, int r) {
	if (l <= t[p].l && r >= t[p].r) return t[p].sum;
	spread(p);
	int mid = (t[p].l + t[p].r) >> 1;
	long long val = 0;
	if (l <= mid) val += ask(p*2, l, r);
	if (r > mid) val += ask(p*2+1, l, r);
	return val;
}
int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++) cin >> a[i];
	build(1, 1, n);
	while (m--) {
		int op, l, r, d;
		cin >> op >> l >> r;
		if (op == 1) {
			cin >> d;
			change(1, l, r, d);
		}
		if (op == 2) cout << ask(1, l, r) << endl;
	}
	return 0;
}
2021/11/18 18:49
加载中...