新手求助
  • 板块题目总版
  • 楼主happyyu
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/12/19 17:20
  • 上次更新2023/12/19 20:26:50
查看原帖
新手求助
742255
happyyu楼主2023/12/19 17:20

P3372

#include <iostream>
#include <algorithm>
using namespace std;

long long a[100005], v[400005], lazy[400005];

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

void pushdown(int x, int l, int r)
{
	int mid = (l + r) / 2;
	v[2 * x] += lazy[x] * (mid - l + 1);
	v[2 * x + 1] += lazy[x] * (r - mid);
	lazy[2 * x] += lazy[x];
	lazy[2 * x + 1] += lazy[x];
	lazy[x] = 0;
}

void query(int x, int l, int r, int ll, int rr, long long val)
{
	if (ll <= l && r <= rr)
	{
		v[x] += 1ll * (r - l + 1) * val;
		lazy[x] += val;
		return;
	}
	if (l >= r) return;
	int mid = (l + r) / 2;
	pushdown(x, l, r);
	if (l <= mid)
	{
		query(x * 2, l, mid, ll, rr, val);
	}
	if (r >= mid)
	{
		query(x * 2 + 1, mid + 1, r, ll, rr, val);
	}
	v[x] = v[x * 2] + v[x * 2 + 1];
}

long long sum(int x, int l, int r, int ll, int rr)
{
	if (l >= ll && r <= rr) return v[x];
	if (l == r)
	{
		return 0;
	}
	int mid = (l + r) / 2, ans = 0;
	pushdown(x, l, r);
	if (ll <= mid) ans += sum(x * 2, l, mid, ll, rr);
	if (rr >= mid) ans += sum(x * 2 + 1, mid + 1, r, ll, rr);
	return ans;
}

int main()
{
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; ++i) cin >> a[i];
	init(1, 1, n);
	for (int i = 1; i <= m; ++i)
	{
		int op;
		cin >> op;
		if (op == 1)
		{
			int x, y, z;
			cin >> x >> y >> z;
			query(1, 1, n, x, y, z);
		}
		if (op == 2)
		{
			int l, r;
			cin >> l >> r;
			cout << sum(1, 1, n, l, r) << endl;
		}
	}
	return 0;
}
2023/12/19 17:20
加载中...