疯狂线段树90pts求调
查看原帖
疯狂线段树90pts求调
866613
sansesantongshun楼主2024/4/13 13:02
#include<bits/stdc++.h>
using namespace std;
int n,m,a[1000005],k,x,y,z;
long long b[4000005],c[4000005][2];
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]=max(b[x<<1],b[x<<1|1]);
	}
	c[x][0]=0x7fffffffffffffff;
}
void cover(int x)
{
	if (c[x][0]!=0x7fffffffffffffff)
	{
		b[x<<1]=c[x][0];
		b[x<<1|1]=c[x][0];
		c[x<<1][0]=c[x][0];
		c[x<<1|1][0]=c[x][0];
		c[x<<1][1]=0;
		c[x<<1|1][1]=0;
		c[x][0]=0x7fffffffffffffff;
	}
}
void pushdown(int x,int l,int r)
{
	cover(x);
	if (c[x][1])
	{
		int mid=l+r>>1;
		cover(x);
		b[x<<1]+=c[x][1];
		b[x<<1|1]+=c[x][1];
		c[x<<1][1]+=c[x][1];
		c[x<<1|1][1]+=c[x][1];
		c[x][1]=0;
	}
}
void modify1(int x,int bl,int br,int l,int r,int y)
{
	if (l<=bl && br<=r)
	{
		b[x]=y;
		c[x][0]=y;
		c[x][1]=0;
	}
	else
	{
		int mid=bl+br>>1;
		pushdown(x,bl,br);
		if (l<=mid)
		modify1(x<<1,bl,mid,l,r,y);
		if (mid<r)
		modify1(x<<1|1,mid+1,br,l,r,y);
		b[x]=max(b[x<<1],b[x<<1|1]);
	}
}
void modify2(int x,int bl,int br,int l,int r,int y)
{
	if (l<=bl && br<=r)
	{
		cover(x);
		b[x]+=y;
		c[x][1]+=y;
	}
	else
	{
		int mid=bl+br>>1;
		pushdown(x,bl,br);
		if (l<=mid)
		modify2(x<<1,bl,mid,l,r,y);
		if (mid<r)
		modify2(x<<1|1,mid+1,br,l,r,y);
		b[x]=max(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=-0x8000000000000000;
	pushdown(x,bl,br);
	if (l<=mid)
	result=max(result,query(x<<1,bl,mid,l,r));
	if (mid<r)
	result=max(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%d",&x,&y,&z);
			modify1(1,1,n,x,y,z);
		}
		else if (k==2)
		{
			scanf("%d%d%d",&x,&y,&z);
			modify2(1,1,n,x,y,z);
		}
		else
		{
			scanf("%d%d",&x,&y);
			cout<<query(1,1,n,x,y)<<'\n';
		}
	}
}
2024/4/13 13:02
加载中...