求助0pts
查看原帖
求助0pts
795344
lfxxx_楼主2025/1/14 16:16
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+5,inf=0x3f3f3f3f3f3f3f3f;
int a[N],sum[N<<2],mx[N<<2],smx[N<<2],mi[N<<2],smi[N<<2],tag[N<<2],cntmx[N<<2],cntmi[N<<2];
void pushup(int p)
{
	int ls=p<<1,rs=p<<1|1;
	sum[p]=sum[ls]+sum[rs];
	mx[p]=max(mx[ls],mx[rs]);
	mi[p]=min(mi[ls],mi[rs]);
	if(mx[ls]==mx[rs])
	{
		smx[p]=max(smx[ls],smx[rs]);
		cntmx[p]=cntmx[ls]+cntmx[rs];
	}
	else
	{
		smx[p]=max({smx[ls],smx[rs],min(mx[ls],mx[rs])});
		cntmx[p]=(mx[ls]>mx[rs])?cntmx[ls]:cntmx[rs];
	}
	if(mi[ls]==mi[rs])
	{
		smi[p]=min(smi[ls],smi[rs]);
		cntmi[p]=cntmi[ls]+cntmi[rs];
	}
	else
	{
		smi[p]=min({smi[ls],smi[rs],max(mi[ls],mi[rs])});
		cntmi[p]=(mi[ls]<mi[rs])?cntmi[ls]:cntmi[rs];
	}
}
void addtag1(int p,int pl,int pr,int d)
{
	tag[p]+=d;
	sum[p]+=(pr-pl+1)*d;
	mx[p]+=d;
	mi[p]+=d;
	if(smx[p]!=-inf)smx[p]+=d;
	if(smi[p]!=inf)smi[p]+=d;
}
void addtag2(int p,int d)
{
	if(mi[p]>=d)
		return ;
	sum[p]+=cntmi[p]*(d-mi[p]);
	mi[p]=d;
}
void addtag3(int p,int d)
{
	if(mx[p]<=d)
		return ;
	sum[p]+=cntmx[p]*(d-mx[p]);
	mx[p]=d;
}
void pushdown(int p,int pl,int pr)
{
	int mid=(pl+pr)>>1;
	if(tag[p])
	{
		addtag1(p<<1,pl,mid,tag[p]);
		addtag1(p<<1|1,mid+1,pr,tag[p]);
		tag[p]=0;
	}
	addtag2(p<<1,mi[p]);
	addtag2(p<<1|1,mi[p]);
	addtag3(p<<1,mx[p]);
	addtag3(p<<1|1,mx[p]);
}
void build(int p,int pl,int pr)
{
	if(pl==pr)
	{
		sum[p]=mx[p]=mi[p]=a[pl];
		smx[p]=-inf;
		smi[p]=inf;
		cntmx[p]=cntmi[p]=1;
		return ;
	}
	int mid=(pl+pr)>>1;
	build(p<<1,pl,mid);
	build(p<<1|1,mid+1,pr);
	pushup(p);	
}
void update1(int p,int pl,int pr,int L,int R,int d)
{
	if(R<pl||pr<L)
		return ;
	if(L<=pl&&pr<=R)
	{
		addtag1(p,pl,pr,d);
		return ;
	}
	int mid=(pl+pr)>>1;
	pushdown(p,pl,pr);
	update1(p<<1,pl,mid,L,R,d);
	update1(p<<1|1,mid+1,pr,L,R,d);
	pushup(p);
}
void update2(int p,int pl,int pr,int L,int R,int d)
{
	if(R<pl||pr<L)
		return ;
	if(mi[p]>=d)
		return ;
	if(L<=pl&&pr<=R&&d<smi[p])
	{
		addtag2(p,d);
		return ;
	}
	int mid=(pl+pr)>>1;
	pushdown(p,pl,pr);
	update2(p<<1,pl,mid,L,R,d);
	update2(p<<1|1,mid+1,pr,L,R,d);
	pushup(p);
}
void update3(int p,int pl,int pr,int L,int R,int d)
{
	if(R<pl||pr<L)
		return ;
	if(mx[p]<=d)
		return ;
	if(L<=pl&&pr<=R&&d>smx[p])
	{
		addtag3(p,d);
		return ;
	}
	int mid=(pl+pr)>>1;
	pushdown(p,pl,pr);
	update3(p<<1,pl,mid,L,R,d);
	update3(p<<1|1,mid+1,pr,L,R,d);
	pushup(p);
}
int query1(int p,int pl,int pr,int L,int R)
{
	if(R<pl||pr<L)
		return 0;
	if(L<=pl&&pr<=R)
		return sum[p];
	pushdown(p,pl,pr);
	int mid=(pl+pr)>>1;
	return query1(p<<1,pl,mid,L,R)+query1(p<<1|1,mid+1,pr,L,R); 
}
int query2(int p,int pl,int pr,int L,int R)
{
	if(R<pl||pr<L)
		return -inf;
	if(L<=pl&&pr<=R)
		return mx[p];
	pushdown(p,pl,pr);
	int mid=(pl+pr)>>1;
	return max(query2(p<<1,pl,mid,L,R),query2(p<<1|1,mid+1,pr,L,R)); 
}
int query3(int p,int pl,int pr,int L,int R)
{
	if(R<pl||pr<L)
		return inf;
	if(L<=pl&&pr<=R)
		return mi[p];
	pushdown(p,pl,pr);
	int mid=(pl+pr)>>1;
	return min(query3(p<<1,pl,mid,L,R),query3(p<<1|1,mid+1,pr,L,R)); 
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n,m;
	cin>>n;
	for(int i=1;i<=n;++i)
		cin>>a[i];
	build(1,1,n);
	cin>>m;
	while(m--)
	{
		int op,l,r,k;
		cin>>op>>l>>r;
		if(op==1)
		{
			cin>>k;
			update1(1,1,n,l,r,k);
		}
		if(op==2)
		{
			cin>>k;
			update2(1,1,n,l,r,k);
		}
		if(op==3)
		{
			cin>>k;
			update3(1,1,n,l,r,k);
		}
		if(op==4)
			cout<<query1(1,1,n,l,r)<<'\n';
		if(op==5)
			cout<<query2(1,1,n,l,r)<<'\n';
		if(op==5)
			cout<<query3(1,1,n,l,r)<<'\n';
	}
}
2025/1/14 16:16
加载中...