#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 100;
const int INF = 0x7ffffffc;
struct node{
int size, key, pri, ls, rs, cnt;//分别为:子树大小,值,优先级, 左儿子,右儿子,重复元素个数
#define s(k) t[k].size
#define v(k) t[k].key
#define p(k) t[k].pri
#define ls(k) t[k].ls
#define rs(k) t[k].rs
#define c(k) t[k].cnt
}t[N];
int pool = 0, rt = 0;
int a[N], u[N];
int n, m;
void upt(int &k){s(k) = s(ls(k)) + s(rs(k)) + 1;}
void zig(int &k)
{
int y = ls(k);
ls(k) = rs(y);
rs(y) = k;
s(y) = s(y);
upt(k);
k = y;
}
void zag(int &k)
{
int y = rs(k);
rs(k) = ls(y);
ls(y) = k;
s(y) = s(k);
upt(k);
k = y;
}
void insert(int &k, const int &key)
{
if(!k)
{
k = ++pool;
v(k) = key;
s(k) = 1;
p(k) = rand();
c(k) = 1;
ls(k) = rs(k) = 0;
return;
}
else
++s(k);
if(v(k) == key)//这里
{
++c(k);
return;
}
else if(v(k) < key)
{
insert(rs(k), key);
if(p(rs(k)) < p(k))
zag(k);
}
else
{
insert(ls(k), key);
if(p(ls(k)) < p(k))
zig(k);
}
}
int query_th(int k)
{
int x = rt;
while(x)
{
if(k > s(ls(k)) && k <= s(ls(k)) + c(k))//这里
return v(x);
if(k <= s(ls(x)))
x = ls(x);
else{
k -= s(ls(x)) + c(k);
x = rs(x);
}
}
return 0;
}
int main()
{
cin >> m >> n;
srand(time(0));
for(int i = 1; i <= m; i++)
cin >> a[i];
for(int i = 1; i <= n; i++)
cin >> u[i];
insert(rt, INF);
insert(rt, -INF);
int k = 1;
int j = 0;
for(int i = 1; i <= m; i++)
{
insert(rt, a[i]);
//cout << a[i] << ' ';
while(i == u[k])
{
cout << query_th(++j + 1) << endl;
k++;
}
}
return 0;
}