什么情况
  • 板块题目总版
  • 楼主N_T_
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/3/17 15:24
  • 上次更新2024/3/17 16:46:40
查看原帖
什么情况
741206
N_T_楼主2024/3/17 15:24
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 50005;
int n, m, a[MAXN], s[4 * MAXN], z[MAXN];

void pushup(int x) {
	s[x] = s[2 * x] + s[2 * x + 1];
};

void init(int x, int l, int r) {
	if (l == r) {
		s[x] = a[l];
		return;
	} else {
		int mid = (l + r) / 2;
		init(2 * x, l, mid);
		init(2 * x, mid + 1, r);
		pushup(x);
	}
}

int query(int l, int r, int p, int q, int x) {
	if (l <= p && q <= r)
		return s[x];

	int mid = p + (q - p) / 2;

	if (z[x]) {
		s[2 * x] += z[x] * (mid - p + 1), s[2 * x + 1] += z[x] * (q - mid);
	}

	z[x] = 0;
	int res = 0;

	if (l <= mid)
		res += query(l, r, p, mid, 2 * x);

	if (r > mid)
		res += query(l, r, mid + 1, q, 2 * x + 1);

	return res;
}

void update(int x, int l, int r, int p, int q, int val) {
	if (l <= p && r <= q) {
		s[x] += (q - p + 1) * val;
		z[x] += val;
		return;
	}

	int mid = p + (q - p) / 2;

	if (z[x]) {
		s[2 * x] += z[x] * (mid - p + 1), s[2 * x + 1] += z[x] * (q - mid);
	}

	z[x] = 0;

	if (l <= mid)
		update(2 * x, l, r, p, mid, val);

	if (r > mid)
		update(2 * x + 1, l, r, mid + 1, q, val);


	pushup(x);
}

int main() {
	cin >> n >> m;

	for (int i = 1; i <= n; i++)
		cin >> a[i];

	init(1, 1, n);

	while (m--) {
		int op, x, y, v;
		cin >> op >> x >> y;

		if (op == 1)
			cin >> v;

		update(1, x, y, 1, n, v);

		if (op == 2)
			cout << query(x, y, 1, n, 1) << endl;
	}

	return 0;
}
2024/3/17 15:24
加载中...