#include <algorithm>
#include <cctype>
#include <cstdio>
#include <iostream>
inline int readInt() {
int ans = 0, c, f = 1;
while (!isdigit(c = getchar()))
if (c == '-') f = -1;
do ans = ans * 10 + c - '0';
while (isdigit(c = getchar()));
return ans * f;
}
const int N = 1e5+3, M = 5e4+3;
int n, m, cnt[M], wei[N];
struct Node {
int a, w, t;
Node() {}
}d[N];
bool cmpt(Node x, Node y) {
return x.t > y.t;
}
bool cmpa(Node x,Node y) {
return x.a > y.a;//按数字大小排序
}
struct treeArray{
int sz[N], len;
treeArray() {}
void Update(int x, int y) {
for ( ; x <= len; x += x & -x) sz[x] += y;
}
int Query(int x) {
int s = 0;
for ( ; x; x -= x & -x) s += sz[x];
return s;
}
} T;//树状数组
void CDQ(int l, int r) {
if (l == r) return;
int mid = (l + r) >> 1;
CDQ(l, mid);
CDQ(mid + 1, r);
std::sort(d + l, d + mid + 1, cmpa);
std::sort(d + mid + 1, d + r + 1, cmpa);
int i = mid + 1, j = l;
for ( ; i <= r; ++i) {
while(d[j].a > d[i].a && j <= mid) {
T.Update(d[j].w, 1);
++j;
}
cnt[d[i].t] += T.Query(d[i].w);
}
for (i = l; i < j; ++i) T.Update(d[i].w, -1);
}//CDQ分治
int main() {
n = readInt(), m = readInt();
T.len = n;
for (int i = 1; i <= n; ++i) {
d[i].a = readInt();
d[i].w = i;//w存下标
wei[d[i].a] = i;
}
for (int i = 1, u; i <= m; ++i) {
u = readInt();
d[wei[u]].t = i;
}
for(int i = 1; i <= n; ++i) if(!d[i].t) {
d[i].t = m;
}
std::sort(d + 1, d + n + 1, cmpt);//先按时间排序
CDQ(1, n);
for (int i = 1; i <= m; ++i) {
printf("%d\n", cnt[i]);
}
return 0;
}
qwq