玄关
#include <bits/stdc++.h>
using namespace std;
int cnt=0;
int inp[200005],fid[200005];
struct Node
{
int ls,rs;
int key,pri;
int sized;
}t[10005];
void newNode(int x)
{
cnt++;
t[cnt].sized=1;
t[cnt].ls=0; t[cnt].rs=0;
t[cnt].key=x;
t[cnt].pri=rand();
}
void updated(int u){t[u].sized=t[t[u].ls].sized+t[t[u].rs].sized+1;}
void rotated(int &o,int d)
{
int k;
if(d==1)
{
k=t[o].rs;
t[o].rs=t[k].ls;
t[k].ls=o;
}
else
{
k=t[o].ls;
t[o].ls=t[k].rs;
t[k].rs=o;
}
t[k].sized=t[o].sized;
updated(o);
o=k;
}
void inserted(int &u,int x)
{
if(u==0) {newNode(x);u=cnt;return;}
t[u].sized++;
if(x>=t[u].key) inserted(t[u].rs,x);
else inserted(t[u].ls,x);
if(t[u].ls!=0&&t[u].pri>t[t[u].ls].pri) rotated(u,0);
if(t[u].rs!=0&&t[u].pri>t[t[u].rs].pri) rotated(u,1);
updated(u);
}
int kth(int u,int k)
{
if(k==t[t[u].ls].sized+1) return t[u].key;
if(k>t[t[u].ls].sized+1) return kth(t[u].rs,k-t[t[u].ls].sized-1);
return kth(t[u].ls,k);
}
int main()
{
int m,n;
scanf("%d%d",&m,&n);
int root=0;
for(int i=1;i<=m;i++) scanf("%d",&inp[i]);
for(int i=1;i<=n;i++)
{
int x; scanf("%d",&x);
fid[x]++;
}
int g=0;
for(int i=1;i<=m;i++)
{
inserted(root,inp[i]);
while(fid[i])
{
g++;
printf("%d\n",kth(root,g));
fid[i]--;
}
}
return 0;
}