#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 9,M = 1e5 + 9;
int n,m,tim;
int p[N],c[N];
struct Graph{
struct edge{
int to,nex;
} e[(N + M) << 1];
int head[N + M],ecnt;
void addedge(int u,int v){
ecnt++;
e[ecnt] = (edge){v,head[u]};
head[u] = ecnt;
}
} G;
int vis[N + M];
int match[N + M];
bool dfs(int u){
for(int i = G.head[u];i;i = G.e[i].nex){
int v = G.e[i].to;
if(vis[v] == tim)
continue;
vis[v] = tim;
if(!match[v] || dfs(match[v])){
match[v] = u;
return true;
}
}
return false;
}
int d;
struct Query{
int id,d;
} q[N];
int ans[N];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> n >> m;
for(int i = 1;i <= n;i++){
cin >> p[i];
p[i]++;
}
for(int i = 1;i <= n;i++)
cin >> c[i];
cin >> d;
for(int i = 1;i <= d;i++){
cin >> q[i].d;
q[i].id = i;
vis[q[i].d] = -1;
}
for(int i = 1;i <= n;i++)
if(vis[i] != -1){
if(p[i] > m + 1)
continue;
G.addedge(p[i],c[i] + m + 1);
}
reverse(q + 1,q + d + 1);
tim = 1;
for(int i = 1;i <= d;i++){
for(;;tim++){
if(!dfs(tim)){
ans[q[i].id] = tim - 1;
break;
}
}
if(p[q[i].d] > m + 1)
continue;
G.addedge(p[q[i].d],c[q[i].d] + m + 1);
}
for(int i = 1;i <= d;i++)
cout << ans[i] << '\n';
return 0;
}