10pts 求条 赏2关
查看原帖
10pts 求条 赏2关
750771
lichenxi111楼主2024/10/14 20:00
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ls u << 1
#define rs u << 1 | 1
const int N = 1e5 + 10;
struct node
{
	int l,r,sum,tag;
} tr[N * 4];
int a[N];
void pushup(int u)
{
	tr[u].sum = tr[ls].sum + tr[rs].sum;
}
void pushdown(int u)
{
	if(!tr[u].tag)
	{
		return;
	}
	tr[ls].sum += (tr[ls].r - tr[ls].l + 1) * tr[u].tag;
	tr[ls].tag += tr[u].tag;
	tr[rs].sum += (tr[rs].r - tr[rs].l + 1) * tr[u].tag;
	tr[rs].tag += tr[u].tag;
	tr[u].tag = 0;
}
void build(int u,int l,int r)
{
	if(l == r)
	{
		tr[u] = {l,r,a[l],0};
		return;
	}
	tr[u].l = l;
	tr[u].r = r;
	int mid = (l + r) >> 1;
	build(ls,l,mid);
	build(rs,mid + 1,r);
	pushup(u);
}
void update(int u,int l,int r,int x)
{
	if(l <= tr[u].l && tr[u].r <= r)
	{
		tr[u].sum += (tr[u].r - tr[u].l + 1) * x;
		tr[u].tag = x;
		return;
	}
	pushdown(u);
	int mid = (tr[u].l + tr[u].r) >> 1;
	if(l <= mid)
	{
		update(ls,l,r,x);
	}
	if(mid < r)
	{
		update(rs,l,r,x);
	}
	pushup(u);
}
int query(int u,int l,int r)
{
	if(l <= tr[u].l && tr[u].r <= r)
	{
		return tr[u].sum;
	}
	pushdown(u);
	int mid = (tr[u].l + tr[u].r) >> 1,ans = 0;
	if(l <= mid)
	{
		ans += query(ls,l,r);
	}
	if(mid < r)
	{
		ans += query(rs,l,r);
	}
	return ans;
}
signed main()
{
	int n,m;
	cin >> n >> m;
	for(int i = 1;i <= n;i++)
	{
		cin >> a[i];
	}
	build(1,1,n);
	while(m--)
	{
		int op;
		cin >> op;
		if(op == 1)
		{
			int l,r,x;
			cin >> l >> r >> x;
			update(1,l,r,x);
		}
		else
		{
			int l,r;
			cin >> l >> r; 
			cout << query(1,l,r) << endl;
		}
	}
	return 0;
}
2024/10/14 20:00
加载中...