记录编号 493893 评测结果 AAAAAA
题目名称 [POJ 1442] 黑盒子 最终得分 100
用户昵称 Gravatar0 是否通过 通过
代码语言 C++ 运行时间 0.138 s
提交时间 2018-04-06 12:23:39 内存使用 0.89 MiB
显示代码纯文本
#include<bits/stdc++.h>

#define maxn 30010

using namespace std;

int rnd[maxn],l[maxn],r[maxn],v[maxn],siz[maxn],rot;

void update(int x)
{
	siz[x]=siz[l[x]]+siz[r[x]]+1;
}

void rt(int &x)
{
	int t=l[x];
	l[x]=r[t];
	r[t]=x;
	update(x);
	x=t;
}

void lt(int &x)
{
	int t=r[x];
	r[x]=l[t];
	l[t]=x;
	update(x);
	x=t;
}

void insert(int &n,int x)
{
	if(!n){ n=x;return; }
	if(v[x]<v[n]){
		insert(l[n],x);
		if(rnd[l[n]]>rnd[n]) rt(n);
	}
	else{
		insert(r[n],x);
		if(rnd[r[n]]>rnd[n]) lt(n);
	}
	update(n);
}

int ask(int x,int k)
{
	if(k==siz[l[x]]+1) return v[x];
	if(k<=siz[l[x]]) return ask(l[x],k);
	else return ask(r[x],k-siz[l[x]]-1);
}

int main()
{
	freopen("blackbox.in","r",stdin);
	freopen("blackbox.out","w",stdout);
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&v[i]); 
	}
	int h=1;
	for(int i=1;i<=m;i++){
		int x;scanf("%d",&x);
		while(h<=x){
			rnd[h]=rand();
			siz[h]=1;
			insert(rot,h++);
		}
		printf("%d\n",ask(rot,i));
	}
}