我 time 是第一维,val 是第二维,pos 是第三维
#include <bits/stdc++.h>
#define INF 1000000007ll;
using namespace std;
inline int read(){
int res=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){res=(res<<1)+(res<<3)+(c^48);c=getchar();}
return res*f;
}
void write(int x){
if(x<0){putchar('-');x=-x;}
if(x>9)write(x/10);
putchar(x%10+'0');
}
int n,m;
int tr[214514],ans[214514];
int ton[214514];
struct node{
int x,y,z;//x time; y val; z pos
}a[214514];
bool cmp(node a,node b){
return a.x > b.x;
}
bool cmp2(node a,node b){
if (a.y == b.y) return a.z < b.z;
return a.y > b.y;
}
bool cmp3(node a,node b){
if (a.y == b.y) return a.z > b.z;
return a.y < b.y;
}
void add(int x,int a){
for (; x <= 1e5; x += (x&-x))
tr[x] += a;
}
int query(int x){
int res = 0;
for (; x; x -= (x&-x))
res += tr[x];
return res;
}
void solve(int l,int r)
{
if (l == r) return ;
int mid = (l+r) >> 1;
solve(l,mid); solve(mid+1,r);
sort(a+l,a+mid+1,cmp2);
sort(a+mid+1,a+r+1,cmp2);
int j = l;
for (int i = mid+1; i <= r; i++)
{
while (a[i].y < a[j].y && j <= mid)
add(a[j].z,1),j++;
ans[a[i].z] += query(a[i].z);
}
for (int i = l; i < j; i++)
add(a[i].z,-1),i++;
sort(a+l,a+mid+1,cmp3);
sort(a+mid+1,a+r+1,cmp3);
j = l;
for (int i = mid+1; i <= r; i++)
{
while (a[i].y > a[j].y && j <= mid)
add(a[j].z,1),j++;
ans[a[i].z] += query(1e5)-query(a[i].z);
}
for (int i = l; i < j; i++)
add(a[i].z,-1),i++;
}
int main()
{
int as = 0;
n = read(); m = read();
for (int i = 1; i <= n; i++)
a[i].y = read(),a[i].z = i,ton[a[i].y] = i;
for (int i = 1,x; i <= m; i++)
x = read(),a[ton[x]].x = i;
for (int i = 1; i <= n; i++)
if (!a[i].z) a[i].x = INF;
// for (int i = n; i >= 1; i--)
// as += query(a[i].y-1),add(a[i].y,1);
// printf("%d\n\n",as);
memset(tr,0,sizeof tr);
sort(a+1,a+n+1,cmp);
solve(1,n);
for (int i = 1; i <= m; i++)
write(ans[i]),puts("");
return 0;
}