模板

#include<bits/stdc++.h>
#define ls p<<1
#define rs p<<1|1
#define root 1,1,n
#define lson p<<1,l,mid
#define rson p<<1|1,mid+1,r
using namespace std;

typedef long long ll;
const int N = 1e5+9;

int n,m,a[N];

struct tree
{
	int l,r;
	ll sum,add;
	
	tree()
	{
		l = r = sum = add = 0;
		return;
	}
	
	void col(ll v)
	{
		sum += v*(r-l+1);
		add += v;
		return;
	}
	
}t[N<<2];

tree operator +(const tree &l,const tree &r)
{
	tree p;
	p.l = l.l,p.r = r.r;
	p.sum = l.sum+r.sum;
	p.add = 0;
	return p;
}

void pushup(int p)
{
	t[p] = t[ls]+t[rs];
	return;
}

void pushdown(int p)
{
	if(t[p].add)
	{
		int v = t[p].add;
		t[ls].col(v);
		t[rs].col(v);
		t[p].add = 0;
	}
	return;
}

void build(int p,int l,int r)
{
	if(l == r)
	{
		t[p].l = t[p].r = l;
		t[p].sum = a[l];
		return;
	}
	
	int mid = l+r>>1;
	build(lson);
	build(rson);
	pushup(p);
	return;
}

void modify(int p,int l,int r,int L,int R,ll v)
{
	if(L <= l && R >= r)
	{
		t[p].col(v);
		return;
	}
	
	pushdown(p);
	
	int mid = l+r>>1;
	if(L <= mid)modify(lson,L,R,v);
	if(R > mid)modify(rson,L,R,v);
	pushup(p);
	return;
}

tree query(int p,int l,int r,int L,int R)
{
	if(L <= l && R >= r)return t[p];
	
	pushdown(p);
	
	int mid = l+r>>1;
	if(R <= mid)return query(lson,L,R);
	else if(L > mid)return query(rson,L,R);
	else return query(lson,L,R) + query(rson,L,R);
}

int main()
{
	
	scanf("%d%d",&n,&m);
	for(int i = 1;i <= n;i++)scanf("%d",&a[i]);
	build(root);
	while(m--)
	{
		int op,l,r;
		scanf("%d%d%d",&op,&l,&r);
		if(op == 1)
		{
			ll v;
			scanf("%lld",&v);
			modify(root,l,r,v);
		}
		else printf("%lld\n",query(root,l,r).sum);
	}
	
	return 0;
}

posted @ 2023-09-24 14:16  AC7  阅读(25)  评论(0)    收藏  举报