求调玄关!!
查看原帖
求调玄关!!
936561
wsgdsgqq楼主2025/1/20 14:37
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define int long long
const int N=5e5+10;
int n,m;
struct yee
{
	int l,r;
	int v,lazy;
}f[4*N];
int left(int rt)
{
	return 2*rt;
}
int right(int rt)
{
	return 2*rt+1;
}
void push_up(int rt)
{
	f[rt].v=f[left(rt)].v+f[right(rt)].v;
}
void push_down(int rt)
{
	int l=f[left(rt)].l,r=f[left(rt)].r,lazy=f[rt].lazy;
	
	f[left(rt)].v+=(r-l+1)*lazy;
	
	l=f[right(rt)].l,r=f[right(rt)].r;
	
	f[right(rt)].v+=(r-l+1)*lazy;

	f[left(rt)].lazy+=lazy;
	f[right(rt)].lazy+=lazy;
	f[rt].lazy=0;
}
void build(int rt,int l,int r)
{
	f[rt].l=l;
	f[rt].r=r;
	f[rt].lazy=f[rt].v=0;
	if(l==r)
		return;
	int mid=(l+r)/2;
	build(left(rt),l,mid);
	build(right(rt),mid+1,r);
}
void add(int rt,int ql,int qr,int v)
{
	int l=f[rt].l,r=f[rt].r;
	int mid=(l+r)/2;
	if(ql<=l&&r<=qr)
	{
		f[rt].v+=(r-l+1)*v;
		f[rt].lazy+=v;
		return;
	}
	push_down(rt);
	if(mid>=ql)
		add(left(rt),ql,qr,v);
	if(mid+1<=qr)
		add(right(rt),ql,qr,v);
	push_up(rt);
}
int find(int rt,int ql,int qr)
{
	int l=f[rt].l,r=f[rt].r,ans=0;
	int mid=(l+r)/2;
	if(ql<=l&&r<=qr)
		return f[rt].v;
	if(ql<=mid)
		ans+=find(left(rt),ql,qr);
	if(mid+1<=qr)
		ans+=find(right(rt),ql,qr);
	push_up(rt);
	return ans;
}
signed main()
{
	scanf("%lld %lld",&n,&m);
	build(1,1,n);
	for(int i=1;i<=n;i++)
	{
		int a;
		scanf("%lld",&a);
		add(1,i,i,a);
	}
	while(m--)
	{
		int o,op,p,p1=0;
		scanf("%lld %lld %lld",&o,&op,&p);
		if(o==1)
		{
			scanf("%d",&p1);
			add(1,op,p,p1);//根,左右端点和加的值 
		}
		else
			printf("%lld\n",find(1,op,p));
	}
	return 0;
}
2025/1/20 14:37
加载中...