#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
const int N = 2e5 + 5;
int arr[N], cnt, root;
struct node{
int v, pri, lc, rc, num, size;
}tree[N];
int New(int v){
tree[++cnt].v = v;
tree[cnt].pri = rand();
tree[cnt].num = tree[cnt].size = 1;
tree[cnt].rc = tree[cnt].lc = 0;
return cnt;
}
void update(int &p){
tree[p].size = tree[tree[p].lc].size + tree[tree[p].rc].size + tree[p].num;
}
void zig(int &p){
int q = tree[p].lc;
tree[p].lc = tree[q].rc;
tree[q].rc = p;
tree[q].size = tree[p].size;
update(p);
p = q;
}
void zag(int &p){
int q = tree[p].rc;
tree[p].rc = tree[q].lc;
tree[q].lc = p;
tree[q].size = tree[p].size;
update(p);
p = q;
}
void Insert(int &p, int v){
if(!p){
p = New(v);
return;
}
tree[p].size++;
if(v == tree[p].v){
tree[p].num++;
return;
}
if(v < tree[p].v){
Insert(tree[p].lc, v);
if(tree[p].pri < tree[tree[p].lc].pri){
zig(p);
}
}else{
Insert(tree[p].rc, v);
if(tree[p].pri < tree[tree[p].lc].pri){
zag(p);
}
}
}
int find1(int &p, int x){
if(!p){
return 0;
}
int t = tree[tree[p].lc].size;
if(t >= x){
return find1(tree[p].lc, x);
}else if(t + tree[p].num < x){
return find1(tree[p].rc, x - t - tree[p].num);
}else{
return tree[p].v;
}
}
void print(int p){
if(p){
print(tree[p].lc);
cout << tree[p].v << ' ' << tree[p].pri << ' ' << tree[p].num << ' ' << tree[p].size << ' ' << tree[tree[p].lc].v << ' ' << tree[tree[p].rc].v << endl;
print(tree[p].rc);
}
}
int main(){
int n, m;
srand(time(0));
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++){
scanf("%d", &arr[i]);
}
int index = 1;
for(int i = 0; i < m; i++){
int x;
scanf("%d", &x);
while(index <= x){
Insert(root, arr[index]);
index++;
}
printf("%d\n", find1(root, i + 1));
}
return 0;
}