Mnzn萌新妹子80pts求助
查看原帖
Mnzn萌新妹子80pts求助
795344
lfxxx_楼主2024/7/8 12:06
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e4+5;
int a[N];
vector<int>block[N];
int L[N],R[N],pos[N];
void rebuild(int x)
{
	block[x].clear();
	for(int i=L[x];i<=R[x];++i)
		block[x].emplace_back(a[i]);
	sort(block[x].begin(),block[x].end());
}
int query_val(int l,int r,int d)
{
	int ans=0,x=pos[l],y=pos[r];
	if(x==y)
	{
		for(int i=l;i<=r;++i)
			if(a[i]<d)
				++ans;
		return ans+1;
	}
	ans=query_val(l,R[x],d)+query_val(L[y],r,d)-2;
	for(int i=x+1;i<y;++i)
		ans+=lower_bound(block[i].begin(),block[i].end(),d)-block[i].begin();
	return ans+1;
}
int query_rank(int l,int r,int k)
{
	int L=-1,R=1e8+1;
	while(L+1<R)
	{
		int mid=L+R>>1;
		if(query_val(l,r,mid)<=k)
			L=mid;
		else
			R=mid; 
	}
	return L;
}
void update(int x,int d)
{
	int k=pos[x];
	a[x]=d;
	rebuild(k);
} 
int query_pre(int l,int r,int d)
{
	int x=pos[l],y=pos[r],ans=-2147483647;
	if(x==y)
	{
		for(int i=l;i<=r;++i)
			if(a[i]<d)
				ans=max(ans,a[i]);
		return ans;
	}
	ans=max(query_pre(l,R[x],d),query_pre(L[y],r,d));
	for(int i=x+1;i<y;++i)
	{
		int k=lower_bound(block[i].begin(),block[i].end(),d)-block[i].begin();
		if(k>0)ans=max(ans,block[i][k-1]);
	}
	return ans;
}
int query_nxt(int l,int r,int d)
{
	int x=pos[l],y=pos[r],ans=2147483647;
	if(x==y)
	{
		for(int i=l;i<=r;++i)
			if(a[i]>d)
				ans=min(ans,a[i]);
		return ans;
	}
	ans=min(query_nxt(l,R[x],d),query_nxt(L[y],r,d));
	for(int i=x+1;i<y;++i)
	{
		int k=upper_bound(block[i].begin(),block[i].end(),d)-block[i].begin();
		if(k<block[i].size())
			ans=min(ans,block[i][k]);
	}
	return ans;
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); 
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;++i)
		cin>>a[i]; 
	int t=sqrt(n);
	for(int i=1;i<=t;++i)
	{
		L[i]=(i-1)*t+1;
		R[i]=i*t;
	}
	if(R[t]<n)
	{
		++t;
		L[t]=R[t-1]+1;
		R[t]=n;
	}
	for(int i=1;i<=t;++i)
	{
		for(int j=L[i];j<=R[i];++j)
		{
			pos[j]=i;
			block[i].emplace_back(a[j]);
		}
		sort(block[i].begin(),block[i].end());
	}
		
	while(m--)
	{
		int op,l,r,k;
		cin>>op>>l;
		if(op==1)
		{
			cin>>r>>k;
			cout<<query_val(l,r,k)<<'\n';
		}
		if(op==2)
		{
			cin>>r>>k;
			cout<<query_rank(l,r,k)<<'\n';
		}
		if(op==3)
		{
			cin>>k;
			update(l,k);
		}
		if(op==4)
		{
			cin>>r>>k;
			cout<<query_pre(l,r,k)<<'\n';
		}
		if(op==5)
		{
			cin>>r>>k;
			cout<<query_nxt(l,r,k)<<'\n';
		}
	}
}
2024/7/8 12:06
加载中...