50pts分块求助
查看原帖
50pts分块求助
1234924
lsd110504lsd楼主2025/2/2 11:09
#include<bits/stdc++.h>
using namespace std;
int n,q;
const int N=1e6+10;
int B,tag[N],cl[N],cr[N],a[N],max_[N],C[N];
inline void build(){
	for(int k=1;k<=(n%B==0?n/B:n/B+1);k++)
	{
		for(int i=(k-1)*B+1;i<=min(n,k*B);i++)
		{
			tag[i]=k;
			cl[i]=(k-1)*B+1;
			cr[i]=min(n,k*B);
			max_[k]=max(max_[k],a[i]);
		}
	}
	return ;
}
inline void add_on(int l,int r,int k)
{
	if(tag[l]==tag[r])
	{
		for(int i=l;i<=r;i++)
		{
			a[i]+=k;
			max_[tag[i]]=max(max_[tag[i]],a[i]);
		}
	}
	else
	{
		for(int i=l;i<=cr[l];i++)
		{
			a[i]+=k;
			max_[tag[i]]=max(max_[tag[i]],a[i]);
		}
		for(int i=cl[r];i<=r;i++)
		{
			a[i]+=k;
			max_[tag[i]]=max(max_[tag[i]],a[i]);
		}
		for(int i=tag[l]+1;i<=tag[r]-1;i++)
		{
			C[i]+=k;
		}
	}
	return ;
}
inline void query(int l,int r)
{
	int ans=0;
	if(tag[l]==tag[r])
	{
		for(int i=l;i<=r;i++)
		{
			ans=max(ans,a[i]+C[tag[i]]);
		}
	}
	else
	{
		for(int i=l;i<=cr[l];i++)
		{
			ans=max(ans,a[i]+C[tag[i]]);
		}
		for(int i=cl[r];i<=r;i++)
		{
			ans=max(ans,a[i]+C[tag[i]]);
		}
		for(int i=tag[l]+1;i<=tag[r]-1;i++)
		{
			ans=max(ans,max_[i]+C[i]);
		}
	}
	cout<<ans<<endl;
	return ;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	memset(max_,-0x3f3f3f3f,sizeof(max_));
	cin>>n>>q;
	B=sqrt(n);
	for(int i=1;i<=n;i++)
		cin>>a[i];
	build();
	for(int i=1;i<=q;i++)
	{
		int opt;
		cin>>opt;
		if(opt==1)
		{
			int l,r,x;
			cin>>l>>r>>x;
			for(int i=l;i<=r;i++)
			{
				a[i]=x;
			}
			if(tag[l]==tag[r])
			{
				max_[tag[i]]=-0x3f3f3f;
				for(int i=cl[l];i<=cr[l];i++)
				{
					max_[tag[i]]=max(a[i],max_[tag[i]]);
				}
			}
			else
			{
				max_[tag[l]]=-0x3f3f3f;
				for(int i=cl[l];i<=cr[l];i++)
				{
					max_[tag[i]]=max(a[i],max_[tag[i]]);
				}
				max_[tag[r]]=-0x3f3f3f;
				for(int i=cl[r];i<=cr[r];i++)
				{
					max_[tag[i]]=max(a[i],max_[tag[i]]);
				}
				for(int i=tag[l]+1;i<=tag[r]-1;i++)
				{
					max_[i]=x;
				}
			}
		}
		if(opt==2)
		{
			int l,r,x;
			cin>>l>>r>>x;
			add_on(l,r,x);
		}
		if(opt==3)
		{
			int l,r;
			cin>>l>>r;
			query(l,r);
		}
	}
	return 0;
}
2025/2/2 11:09
加载中...