爆0求助
查看原帖
爆0求助
373530
Reply_楼主2022/10/24 22:09

呜呜呜

#include<bits/stdc++.h>
using namespace std;
struct Node
{
	int l,r,sum,add;
}t[40100101];
int a[10000001];
inline void build(int li,int ri,int w)
{
	t[w].l=li;
	t[w].r=ri;
	if(li==ri){
		t[w].sum=a[li];
		return;
	}
	int mid=(li+ri)>>1;
	build(li,mid,2*w);
	build(mid+1,ri,2*w+1);
	t[w].sum=t[w*2].sum+t[w*2+1].sum;
	return;
}
inline void push_down(int p)
{
	if(t[p].add)
	{
		t[p*2].sum+=t[p].add*(t[p*2].r-t[p*2].l+1);
		t[p*2+1].sum+=t[p].add*(t[p*2+1].r-t[p*2+1].l+1);
		t[p*2].add+t[p].add;
		t[p*2+1].add+=t[p].add;
		t[p].add=0;
	}
}
inline void change(int li,int ri,int w,int ad)
{
	if(li<=t[w].l && ri>=t[w].r)
	{
		t[w].sum+=ad*(t[w].r-t[w].l+1);
		t[w].add+=ad;
		return;
	}
	push_down(w);
	int mid=t[w].l+t[w].r>>1,s=0;
	if(li<=mid) change(li,ri,w*2,ad);
	if(ri>mid) change(li,ri,w*2+1,ad);
	return;
}
inline int find(int li,int ri,int w)
{
	if(t[w].l>=li&&t[w].r<=ri)return t[w].sum;
	push_down(w);
	int mid=t[w].l+t[w].r>>1,s=0;
	if(li<=mid) s+=find(li,mid,w*2);
	if(ri>=mid) s+=find(mid+1,ri,w*2+1);
	return s;
} 
int main()
{
	int n,m;
	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 op;
		cin >> op;
		if(op==1)
		{
			int l,r,ad;
			cin >> l >> r >>ad;
			change(l,r,1,ad);
		}
		else
		{
			int l,r;
			cin >> l >> r;
			cout<<find(l,r,1);
		}
	}
	return 0;
}
2022/10/24 22:09
加载中...