线段树 WA on #21
查看原帖
线段树 WA on #21
866613
sansesantongshun楼主2023/12/29 11:36
#include<bits/stdc++.h>
using namespace std;
int n,m,k,x,y,a[200005];
long long z,b[800005],c[800005];
void build(int x,int l,int r)
{
	if (l==r)
	b[x]=a[l];
	else
	{
		int mid=l+r>>1;
		build(x<<1,l,mid);
		build(x<<1|1,mid+1,r);
		b[x]=b[x<<1]+b[x<<1|1];
	}
}
void modify(int x,int bl,int br,int l,int r,long long y)
{
	if (l<=bl && br<=r)
	{
		b[x]+=(br-bl+1)*y;
		c[x]+=y;
		return;
	}
	int mid=bl+br>>1;
	b[x<<1]+=(mid-bl+1)*c[x];
	b[x<<1|1]+=(br-mid)*c[x];
	c[x<<1]+=c[x];
	c[x<<1|1]+=c[x];
	c[x]=0;
	if (l<=mid)
	modify(x<<1,bl,mid,l,r,y);
	if (mid<r)
	modify(x<<1|1,mid+1,br,l,r,y);
	b[x]=b[x<<1]+b[x<<1|1];
}
long long query(int x,int bl,int br,int l,int r)
{
	if (l<=bl && br<=r)
	return b[x];
	int mid=bl+br>>1;
	long long result=0;
	b[x<<1]+=(mid-bl+1)*c[x];
	b[x<<1|1]+=(br-mid)*c[x];
	c[x<<1]+=c[x];
	c[x<<1|1]+=c[x];
	c[x]=0;
	if (l<=mid)
	result+=query(x<<1,bl,mid,l,r);
	if (mid<r)
	result+=query(x<<1|1,mid+1,br,l,r);
	return result;
}
int main()
{
	cin>>n>>m;
	for (int i=1;i<=n;++i)
	scanf("%d",&a[i]);
	build(1,1,n);
	while (m--)
	{
		scanf("%d",&k);
		if (k==1)
		{
			scanf("%d%d%lld",&x,&y,&z);
			modify(1,1,n,x,y,z);
		}
		else if (k==2)
		{
			scanf("%lld",&z);
			modify(1,1,n,1,1,z);
		}
		else if (k==3)
		{
			scanf("%lld",&z);
			modify(1,1,n,1,1,-z);
		}
		else if (k==4)
		{
			scanf("%d%d",&x,&y);
			cout<<query(1,1,n,x,y)<<'\n';
		}
		else
		cout<<query(1,1,n,1,1)<<'\n';
	}
}
2023/12/29 11:36
加载中...