rt
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#include<cstring>
#define Max(x,y) ((x)>(y)?(x):(y))
using namespace std;
const int N=2e5+5,B=1005;
int n,m;
int a[N];
bool de[N];
int L[B],R[B],pos[N];
int numpos[N];
vector<int>block[B];
int tr[N];
void add(const int &x,const int &d)
{
for(int i=x;i<=n;i+=i&-i)
tr[i]+=d;
}
int query(const int &x)
{
int res=0;
for(int i=x;i;i-=i&-i)
res+=tr[i];
return res;
}
int query1(const int &l,const int &r,const int &v)//求比 v 小的数的个数
{
int x=pos[l],y=pos[r],ans=0;
if(x==y)
{
for(int i=l;i<=r;++i)
if(a[i]<v&&!de[i])
++ans;
return ans;
}
for(int i=l;i<=R[x];++i)
if(a[i]<v&&!de[i])
++ans;
for(int i=L[y];i<=r;++i)
if(a[i]<v&&!de[i])
++ans;
for(int i=x+1;i<y;++i)
{
int x=lower_bound(block[i].begin(),block[i].end(),v)-block[i].begin();
if(block[i][x]==v)
--x;
ans+=Max(0,x);
}
return ans;
}
int query2(const int &l,const int &r,const int &v)//求解比 v 大的数的个数
{
int x=pos[l],y=pos[r],ans=0;
if(x==y)
{
for(int i=l;i<=r;++i)
if(a[i]>v&&!de[i])
++ans;
return ans;
}
for(int i=l;i<=R[x];++i)
if(a[i]>v&&!de[i])
++ans;
for(int i=L[y];i<=r;++i)
if(a[i]>v&&!de[i])
++ans;
for(int i=x+1;i<y;++i)
ans+=block[i].size()-(upper_bound(block[i].begin(),block[i].end(),v)-block[i].begin());
return ans;
}
void update(const int &x)
{
const int p=numpos[x];
de[p]=1;
block[pos[p]].erase(lower_bound(block[pos[p]].begin(),block[pos[p]].end(),x));
}
void solve()
{
const int t=sqrt(n*log2(n));int tt=n/t;
for(int i=1;i<=n;++i)
cin>>a[i],numpos[a[i]]=i,tr[i]=0,de[i]=0;
for(int i=1;i<=tt;++i)
{
L[i]=R[i-1]+1;
R[i]=R[i-1]+t;
}
if(R[tt]<n)
{
++tt;
L[tt]=R[tt-1]+1;
R[tt]=n;
}
for(int i=1;i<=tt;++i)
{
block[i].clear();
for(int j=L[i];j<=R[i];++j)
{
block[i].emplace_back(a[j]);
pos[j]=i;
}
sort(block[i].begin(),block[i].end());
}
long long ans=0;
for(int i=1;i<=n;++i)
{
ans+=i-1-query(a[i]);
add(a[i],1);
}
while(m--)
{
int x;
cin>>x;
cout<<ans<<'\n';
ans-=query2(1,numpos[x],x)+query1(numpos[x],n,x);
update(x);
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
while(cin>>n>>m)
solve();
}