```cpp
#include <bits/stdc++.h>
using namespace std;
struct Number{
int erase, value, ans;
}arr[100005];
auto cmp1 = [](Number a, Number b){
return a.value < b.value;
};
auto cmp2 = [](Number a, Number b){
return a.erase < b.erase;
};
int tree[100005], pos[100005];
int n, m;
int lowbit(int x) {
return x & (-x);
}
void add(int x, int y) {
for(; x <= n; x += lowbit(x)) {
tree[x] += y;
}
}
int ask(int x) {
int ret = 0;
for(; x > 0; x -= lowbit(x)) {
ret += tree[x];
}
return ret;
}
void CDQ(int l, int r){
if(l == r) return;
int mid = (l + r) / 2;
CDQ(l, mid);
CDQ(mid + 1, r);
int j = l;
for(int i = mid + 1; i <= r; i++){
while(arr[i].value >= arr[j].value && j <= mid) {
add(arr[j].erase, 1);
j++;
}
arr[i].ans += ask(arr[i].erase);
}
for(int i = l; i < j; i++){
add(arr[i].erase, -1);
}
int i = mid + 1;
for(int j = r; j > mid; j--){
while(arr[j].value < arr[i].value && i <= r) {
add(arr[i].erase, 1);
i--;
}
arr[j].ans += ask(arr[j].erase);
}
for(int j = i; j <= r; j++){
add(arr[j].erase, -1);
}
sort(arr + l + 1, arr + r + 1, cmp1);
}
int main(){
int res = 0;
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++){
scanf("%d", &arr[i].value), arr[i].erase = m + 1;
pos[arr[i].value] = i;
}
for(int i = 1, t; i <= m; i++){
scanf("%d", &t);
arr[pos[t]].erase = i;
}
for(int i = n; i >= 1; i--){
res += ask(arr[i].value);
add(arr[i].value, 1);
}
for(int i = 1; i <= n; i++){
add(arr[i].value, -1);
}
CDQ(1, n);
sort(arr + 1, arr + n + 1, cmp1);
for(int i = 1; i <= m; i++){
printf("%d\n", res);
res -= arr[i].ans;
}
return 0;
}
```
by LiuTianyou @ 2022-10-04 09:30:35
@[LordLaffey](/user/335136)
by laplace_oo @ 2022-10-05 07:31:35