蒟蒻求助!0分
查看原帖
蒟蒻求助!0分
748239
OIbishop楼主2022/10/14 14:13
#include <bits/stdc++.h>
#define ls o<<1
#define rs o<<1|1
using namespace std;
int a[100005] , f[100005] , v[100005];
inline void push_up (int o)
{
	f[o] = f[ls] + f[rs]; 
}

void build_tree (int o , int l , int r)
{
	if (l == r)
	{
		f[o] = a[l];
		return ;
	}
	int mid = (l + r) >> 1;
	build_tree (ls , l , mid);
	build_tree (rs , mid + 1 , r);
	push_up (o);
}

void push_down (int o , int l , int r)
{
	if (v[o])
	{
		int mid = (l + r) >> 1;
		f[ls] += (mid - l + 1) * v[o];
		f[rs] += (r - mid) * v[o];
		v[ls] += v[o];
		v[rs] += v[o];
		v[o] = 0;
	}
}

void add (int o , int l , int r , int s , int t , int p)
{
	if (l >= s && r <= t)
	{
		f[o] += (t - s + 1) * p;
		v[o] += p;
		return;
	}
	push_down (o , l , r);
	int mid = (l + r) >> 1;
	if (t <= mid)
		add (ls , l , mid , s , t , p);
	else if (s > mid)
		add (rs , mid + 1 , r , s , t , p);
	else 
		add (ls , l , mid , s , mid , p) , add (rs , mid + 1 , r , mid + 1 , t , p);
}

int calc (int o , int l , int r , int s , int t)
{
	if (l == s && r == t)
	{
		return f[o];
	}
	push_down (o , l , r);
	int mid = (l + r) >> 1;
	if (t <= mid)
		return calc (ls , l , mid , s , t);
	else if (s > mid)
		return calc (rs , mid + 1 , r , s , t);
	else 
		return calc (ls , l , mid , s , mid) + calc (rs , mid + 1 , r , mid + 1 , t);
}

signed main ()
{
	ios::sync_with_stdio (false);
	int n , m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
	}
	build_tree (1 , 1 , n);
	for (int i = 1; i <= m; i++)
	{
		int op , x , y;
		cin >> op >> x >> y;
		if (op == 1)
		{
			int k;
			cin >> k;
			add (1 , 1 , n , x , y , k);
		}
		else if (op == 2)
		{
			cout << calc (1 , 1 , n , x , y) << endl;
		}
	}
	return 0;
}
2022/10/14 14:13
加载中...