#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
const int N = 100010;
struct Data{
int X,Y,T;long long len;
bool operator <(const Data &t)const{
return T<t.T;
}
}rem[N],f[N],t[N];
int n,m,ban[N],bplace[N],A[N],T[N];
long long Ans,ans[N];
inline int gi()
{
int x=0,res=1;char ch=getchar();
while(ch>'9' || ch<'0'){if(ch=='-')res=-res;ch=getchar();}
while(ch>'/' && ch<':')x=x*10+ch-48,ch=getchar();
return x*res;
}
inline int lb(int k){return k&-k;}
inline void update(int x){for(;x<=n;x+=lb(x))T[x]++;}
inline int query(int x)
{
int ans=0;
for(;x;x-=lb(x))ans+=T[x];
return ans;
}
inline void clean(int x){for(;x<=n;x+=lb(x))T[x]=0;}
inline void calc()
{
memset(T,0,sizeof(T));Ans=0;
for(int i=1;i<=n;++i){
Ans+=(i-query(A[i])-1);
update(A[i]);
}
memset(T,0,sizeof(T));
}
//在外面保证T有序,CDQ内保证X有序,统计Y值。
//T:时间 X:位置 Y:权值
//CDQ calc Ti<Tj Xi<Xj Y[i]<Y[j]
inline void CDQ(int l,int r)
{
if(l==r)return;int mid=(l+r)>>1;
CDQ(l,mid);CDQ(mid+1,r);
int x=l,y=mid+1,z=l;
while(x<=mid && y<=r)
if(f[x].X<f[y].X)update(f[x].Y),t[z++]=f[x++];
else f[y].len+=query(f[y].Y),t[z++]=f[y++];
while(x<=mid)t[z++]=f[x++];
while(y<=r)f[y].len+=query(f[y].Y),t[z++]=f[y++];
for(int i=l;i<=mid;++i)clean(f[i].Y);
for(int i=l;i<=r;++i)f[i]=t[i];
}
int main()
{
n=gi();m=gi();
for(int i=1;i<=n;++i)
A[i]=gi();
for(int i=1;i<=m;++i)
bplace[ban[i]=gi()]=i;
for(int i=1;i<=n;++i){
rem[i].T=bplace[A[i]];
rem[i].X=i;
rem[i].Y=A[i];
if(!rem[i].T)rem[i].T=m+1;
}
sort(rem+1,rem+n+1);calc();
for(int i=0;i<=m;++i)ans[i]=Ans;
for(int i=1;i<=n;++i){
f[i]=rem[i];
f[i].Y=n-f[i].Y+1;
}
reverse(f+1,f+n+1);
CDQ(1,n);sort(f+1,f+n+1);
for(long long i=1,s=0;i<=n;++i){
if(!f[i].T)continue;
ans[f[i].T]-=s;s+=f[i].len;
}
for(int i=1;i<=n;++i){
f[i]=rem[i];
f[i].X=n-f[i].X+1;
}
reverse(f+1,f+n+1);
CDQ(1,n);sort(f+1,f+n+1);
for(long long i=1,s=0;i<=n;++i){
if(!f[i].T)continue;
ans[f[i].T]-=s;s+=f[i].len;
}
for(int i=1;i<=m;++i)
printf("%lld\n",ans[i]);
return 0;
}