RE求助
查看原帖
RE求助
1041369
Gua_gua_楼主2023/9/17 14:12
#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
int n,m;
int a[100005],ans[200005],tag[200005]; 
void push_up(int node)
{
	ans[node]=ans[node<<1]+ans[node<<1|1];
}
void push_down(int node,int l,int r)
{
	int mid=(l+r)>>1;
	tag[node<<1]+=tag[node];
	tag[node<<1|1]+=tag[node];
	ans[node<<1]+=tag[node]*(mid-l+1);
	ans[node<<1|1]+=tag[node]*(r-mid);
	tag[node]=0;
}
void build(int node,int l,int r)
{
	if(l==r)
	{
		ans[node]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(node<<1,l,mid);
	build(node<<1|1,mid+1,r);
	push_up(node);
}
void update(int l,int r,int nodel,int noder,int node,int x)
{
	if(l<=nodel&&noder<=r)
	{
		ans[node]+=x*(noder-nodel+1);
		tag[node]+=x;
		return;
	}
	push_down(node,nodel,noder);
	int mid=(l+r)>>1;
	if(l<=mid)update(l,r,nodel,mid,node<<1,x);
	if(r>mid)update(l,r,mid+1,noder,node<<1|1,x);
	push_up(node);
}
int query(int l,int r,int nodel,int noder,int node)
{
	if(l<=nodel&&noder<=r)return ans[node];
	int ret=0,mid=(l+r)>>1;
	push_down(node,nodel,noder);
	if(l<=mid)ret+=query(l,r,nodel,mid,node<<1);
	if(r>mid)ret+=query(l,r,mid+1,noder,node<<1|1);
	return ret;
}
main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	build(1,1,n);
	for(int i=1,x,y,k;i<=m;i++)
	{
		scanf("%lld",&x);
		if(x==1)
		{
			scanf("%lld%lld%lld",&x,&y,&k);
			update(x,y,1,n,1,k);
		}
		else
		{
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",query(x,y,1,n,1));
		}
	}
	return 0;
}

2023/9/17 14:12
加载中...