FHQ-Treap16pts求调
  • 板块P1801 黑匣子
  • 楼主Mei_Misaki
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/10/19 08:59
  • 上次更新2024/10/19 11:10:24
查看原帖
FHQ-Treap16pts求调
386737
Mei_Misaki楼主2024/10/19 08:59
#include<bits/stdc++.h>  
#define N (int)2e5+5 
using namespace std;    
struct node{
	int key,val,si,l,r;
}tr[N*2];   
void push_up(int u){
	tr[u].si=tr[tr[u].l].si+tr[tr[u].r].si+1; 
	return;
}  
int a[N],b[N],t=1;  
int rt,dl,dr,temp,tot; 
void split(int u,int x,int &l,int &r){
	if(u==0){
		l=r=0; 
		return;
	}
	if(tr[u].key<=x){
		l=u; 
		split(tr[u].r,x,tr[u].r,r); 
	} 
	else{
		r=u; 
		split(tr[u].l,x,l,tr[u].l);
	} 
	push_up(u);
} 
int merge(int l,int r){
	if(!l||!r)
		return l+r;
	if(tr[l].key<=tr[r].key){
		tr[l].r=merge(tr[l].r,r); 
		push_up(l); 
		return l;
	} 
	else{
		tr[r].l=merge(l,tr[r].l); 
		push_up(r); 
		return r;
	}
} 
int get_rand(int x){
	tr[++tot].key=x; 
	tr[tot].val=rand();  
	tr[tot].si=1; 
	return tot;
}
void add(int x){
	split(rt,x-1,dl,dr); 
	rt=merge(merge(dl,get_rand(x)),dr);
}  
int get_rk(int u,int x){
	int res=tr[tr[u].l].si+1; 
	if(res==x)return tr[u].key; 
	else if(res<x)return get_rk(tr[u].r,x-res); 
	else return get_rk(tr[u].l,x);
}
int n,m; 
int main(){ 
	ios::sync_with_stdio(false); 
	cin>>n>>m; 
	for(int i=1;i<=n;i++)cin>>a[i]; 
	for(int i=1;i<=m;i++)cin>>b[i]; 
	for(int i=1;i<=n;i++){
		add(a[i]); 
		while(b[t]==i){
			cout<<get_rk(rt,t)<<endl;  
			t++; 
		}
	}
	
	return 0;
} 

评测记录

2024/10/19 08:59
加载中...