求调
查看原帖
求调
1251525
wisdom2010楼主2025/1/15 20:23
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 10;
int d[maxn];
int a[maxn];
int m, n;
void build(int l, int r, int p) //建树
{
	if(l == r)
	{
		d[p] = a[l];
		return ;
	}
	int mid = l + (r - l) / 2;
	build(l, mid, p * 2);
	build(mid + 1, r, p * 2 + 1);
	d[p] = d[p * 2] + d[p * 2 + 1];
}
int b[maxn] = {0};
void update(int l, int r, int s, int t, int c, int p) //区间修改
{
	if(l <= s && t <= r)
	{
		b[p] += c;
		d[p] += c * (t - s + 1);
		return ;
	}
	int mid = s + (t - s) / 2;
	if(b[p] != 0 && s != t)
	{
		b[p * 2] += b[p];
		b[p * 2 + 1] += b[p];
		d[p * 2] += b[p] * (mid - s + 1);
		d[p * 2 + 1] += b[p] * (t - mid);
		b[p] = 0;
	}
	if(l <= mid)
		update(l, r, s, mid, c, p * 2);
	if(r > mid)
		update(l, r, mid + 1, r, c, p * 2 + 1);
	d[p] = d[p * 2] + d[p * 2 + 1];
}
int sum = 0;
int ask(int l, int r, int s, int t, int p) // 区间求和
{
	if(l <= s && t <= r)
		return d[p];
	int mid = s + (t - s) / 2;
	if(b[p] != 0)
	{
		b[p * 2] = b[p];
		b[p * 2 + 1] = b[p];
		d[p * 2] += b[p] * (mid - s + 1);
		d[p * 2 + 1] += b[p] * (t-mid);
		b[p] = 0;
	}
	if(l <= mid)
		sum += ask(l, r, s, mid, p * 2);
	if(r > mid)
		sum += ask(l, r, mid + 1, r, p * 2 + 1);
	return sum;
}
int main()
{
	ios :: sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	for(int i = 1; i <= n; i++)
		cin >> a[i];
	build(1, n, 1);
	while(m--)
	{
		int op;
		cin >> op;
		if(op == 1)
		{
			int x, y, k;
			cin >> x >> y >> k;
			update(x, y, 1, n, k, 1);
		}
		if(op == 2)
		{
			int x, y;
			cin >> x >> y;
			cout << ask(x, y, 1, n, 1) << "\n";
			sum = 0;
		}
	}
	return 0;
}
2025/1/15 20:23
加载中...