小萌新求调
查看原帖
小萌新求调
1248522
mlvx楼主2024/8/13 11:26

样例不过,前两个输出 11,后面三个是对的 /kel /kel

#include<bits/stdc++.h>
using namespace std;
#define pl (p<<1)
#define pr (p<<1|1)
const int N=5e4+10,NLOGN=1e6+10,inf=2147483647;
int n,q,a[N],rt[N<<2];
struct Treap{
	int tot,val[NLOGN],dat[NLOGN],cnt[NLOGN],siz[NLOGN],son[NLOGN][2];
	int add(int v){return++tot,val[tot]=v,dat[tot]=rand(),cnt[tot]=siz[tot]=1,tot;}
	void push_up(int x){siz[x]=siz[son[x][0]]+siz[son[x][1]]+cnt[x];}
	void rotate(int&x,int d){int tmp=son[x][d^1];son[x][d^1]=son[tmp][d],son[tmp][d]=x,x=tmp,push_up(son[x][d]),push_up(x);}
	void insert(int&x,int v){
		if(!x)return x=add(v),void();
		if(v==val[x])return ++cnt[x],push_up(x);
		int d=v<val[x]?0:1;insert(son[x][d],v),dat[x]<dat[son[x][d]]&&(rotate(x,d^1),1),push_up(x);
	}void remove(int&x,int v){
		if(!x)return;
		if(v==val[x]){
			if(cnt[x]>1)return--cnt[x],push_up(x);
			if(son[x][0]||son[x][1])!son[x][1]||dat[son[x][0]]>dat[son[x][1]]?(rotate(x,1),remove(son[x][1],v),1):(rotate(x,0),remove(son[x][0],v),1),push_up(x);
			else x=0;
		}else v<val[x]?(remove(son[x][0],v),1):(remove(son[x][1],v),1),push_up(x);
	}int getrank(int x,int v){
		if(!x)return 0;
		if(v==val[x])return siz[son[x][0]];
		return v<val[x]?getrank(son[x][0],v):getrank(son[x][1],v)+siz[son[x][0]]+cnt[x];
	}int getlast(int rt,int v){
		int x=rt,ret=-inf;
		while(x)v>val[x]?(ret=val[x],x=son[x][1]):x=son[x][0];
		return ret;
	}int getnext(int rt,int v){
		int x=rt,ret=inf;
		while(x)v<val[x]?(ret=val[x],x=son[x][0]):x=son[x][1];
		return ret;
	}
}t;
void build(int l,int r,int p){
	for(int i=l;i<=r;i++)t.insert(rt[p],a[i]);
	if(l==r)return;
	int mid=l+r>>1;build(l,mid,pl),build(mid+1,r,pr);
}void update(int l,int r,int k,int v,int p){
	t.remove(rt[p],a[k]),t.insert(rt[p],v);
	if(l==r)return;
	int mid=l+r>>1;k<=mid?(update(l,mid,k,v,pl),1):(update(mid+1,r,k,v,pr),1);
}int queryrank(int l,int r,int le,int ri,int v,int p){
	if(l>=le&&r<=ri)return t.getrank(rt[p],v);
	int mid=l+r>>1,ret=0;
	return le<=mid&&(ret+=queryrank(l,mid,le,ri,v,pl)),ri>mid&&(ret+=queryrank(mid+1,r,le,ri,v,pr)),ret;
}int queryval(int l,int r,int rk){
	int L=0,R=1e8,mid;
	for(;L<R;queryrank(1,n,l,r,mid=L+R>>1,1)+1<=rk?L=mid:R=mid-1);
	return L;
}int querylast(int l,int r,int le,int ri,int v,int p){
	if(l>=le&&r<=ri)return t.getlast(rt[p],v);
	int mid=l+r>>1,ret=-inf;
	return le<=mid&&(ret=max(ret,querylast(l,mid,le,ri,v,pl))),ri>mid&&(ret=max(ret,querylast(mid+1,r,le,ri,v,pr))),ret;
}int querynext(int l,int r,int le,int ri,int v,int p){
	if(l>=le&&r<=ri)return t.getnext(rt[p],v);
	int mid=l+r>>1,ret=inf;
	return le<=mid&&(ret=min(ret,querynext(l,mid,le,ri,v,pl))),ri>mid&&(ret=min(ret,querynext(mid+1,r,le,ri,v,pr))),ret;
}
int main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,n,1);
	for(int op,l,r,x;q--;){
		cin>>op>>l>>r;
		if(op==1)cin>>x,cout<<queryrank(1,n,l,r,x,1)+1<<'\n';
		if(op==2)cin>>x,cout<<queryval(1,n,x)<<'\n';
		if(op==3)update(1,n,l,r,1),a[l]=r;
		if(op==4)cin>>x,cout<<querylast(1,n,l,r,x,1)<<'\n';
		if(op==5)cin>>x,cout<<querynext(1,n,l,r,x,1)<<'\n';
	}return 0;
}
2024/8/13 11:26
加载中...