修改挂了求条
查看原帖
修改挂了求条
487383
imnoob楼主2024/8/4 20:48

悬关

#include <bits/stdc++.h>
using namespace std;
int n, m, a[100010];
int t[10000010], tag[10000010], cnt = 0;
void build(int l, int r, int p)
{
	if(l == r)
	{
		t[p] = a[l];
		return;
	}
	int mid = (l + r) / 2;
	build(l, mid, p * 2);
	build(mid + 1, r, p * 2 + 1);
	t[p] = t[p * 2] + t[p * 2 + 1]; 
}
void f(int l, int r, int p, int k)
{
	tag[p] += k;
	t[p] += k * (r - l - 1);
}
void push(int l, int r, int p)
{
	int mid = (l + r) / 2;
	f(l, mid, p * 2, tag[p]);
	f(mid + 1, r, p * 2 + 1, tag[p]);
	tag[p] = 0;
}
void add(int x, int y, int l, int r, int p, int k)
{
	if(x <= l && r <= y)
	{
		t[p] += k * (r - l - 1);
		tag[p] += k;
		return;
	}
	push(l, r, p);
	int mid = (l + r) / 2;
	if(x <= mid)
	{
		add(x, y, l, mid, p * 2, k);
	}
	if(mid < y)
	{
		add(x, y, mid + 1, r, p * 2 + 1, k);	
	}
	t[p] = t[p * 2] + t[p * 2 + 1];
}
int ans(int x, int y, int l, int r, int p)
{
	if(x <= l && r <= y)
	{
		return t[p];
	}
	int sum = 0, mid = (l + r) / 2;
	push(l, r, p);
	if(x <= mid)
	{
		sum += ans(x, y, l, mid, p * 2);
	}
	if(mid < y)
	{
		sum += ans(x, y, mid + 1, r, p * 2 + 1);
	}
	return sum;
}
int main()
{
	cin >> n >> m;
	for(int i = 1; i <= n; ++i)
	{
		cin >> a[i];
	}
	build(1, n, 1); 
	for(int i = 1; i <= m; ++i)
	{
		int u, x, y, k;
		cin >> u >> x >> y;
		if(u == 1)
		{
			cin >> k;
			add(x, y, 1, n, 1, k);
		}
		else
		{
			cout << ans(x, y, 1, n, 1) << '\n';
		}
	}
	return 0;
} 
2024/8/4 20:48
加载中...