P1533 Splay求调
  • 板块灌水区
  • 楼主Zq_water
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/1/25 19:53
  • 上次更新2024/1/25 21:48:19
查看原帖
P1533 Splay求调
895435
Zq_water楼主2024/1/25 19:53
#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e5+5;

int n,m,rt,tot,a[maxn],ans[maxn];
int son[maxn][2],fa[maxn],cnt[maxn],siz[maxn],val[maxn];
struct Query{int l,r,k,id;}q[maxn];

void push_up(int x){siz[x]=siz[son[x][0]]+siz[son[x][1]]+cnt[x];}
bool check(int x){return x==son[fa[x]][1];}
void rotate(int x){
	int y=fa[x],z=fa[y],k=check(x);
	son[y][k]=son[x][!k],fa[son[x][!k]]=y;
	son[x][!k]=y,fa[y]=x,fa[x]=z;
	if(z) son[z][son[z][1]==y]=x;
	push_up(x),push_up(y);
}
void splay(int x,int k){
	while(fa[x]!=k){
		int y=fa[x],z=fa[y];
		if(z!=k)rotate(check(x)^check(y)?x:y);
		rotate(x);
	}
	if(!k)rt=x;
}
void find(int x){
	int u=rt;
	if(!u)return;
	while(son[u][val[u]<x]&&x!=val[u])u=son[u][val[u]<x];
	splay(u,0);
}
void insert(int x){
	int u=rt,f=0;
	while(u&&val[u]!=x)f=u,u=son[u][val[u]<x];
	if(u)cnt[u]++;
	else{
		u=++tot;
		if(f)son[f][val[f]<x]=u;
		fa[tot]=f,val[tot]=x,siz[tot]=1,cnt[tot]=1;
	}
	splay(u,0);
}
int PreNext(int x,int op){
	find(x);
	int u=son[rt][op];
	while(son[u][!op])u=son[u][!op];
	return u;
}
void del(int x){
	int pre=PreNext(x,0),nxt=PreNext(x,1);
	splay(pre,0),splay(nxt,pre);
	int u=son[nxt][0];
	if(cnt[u]>1)cnt[u]--,splay(u,0);
	else son[nxt][0]=0;
}

int kth(int x){
	int u=rt;
	while(1){
		if(x<=siz[son[x][0]])u=son[u][0];
		else if(x<=(siz[son[u][0]]+cnt[u]))return u;
		else x-=(siz[son[u][0]+cnt[u]]),u=son[u][1];
	}
}
bool cmp(Query x,Query y){
	if(x.l==y.l)return x.r<y.r;
	return x.l<y.l;
}
signed main(){
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	
	insert(-2e9),insert(2e9);
	for(int i=1,l,r,k;i<=m;i++)scanf("%d %d %d",&l,&r,&k),q[i]={l,r,k,i};
	sort(q+1,q+m+1,cmp);
	int l=1,r=0;
	for(int i=1;i<=m;i++){
		while(l<q[i].l)del(a[l]),l++;
		while(l>q[i].l)l--,insert(a[l]);
		while(r<q[i].r)r++,insert(a[r]);
		while(r>q[i].r)del(a[r]),r--;
		ans[q[i].id]=val[kth(q[i].k+1)];
	}
	for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
	return 0;
}

2024/1/25 19:53
加载中...