#include <bits/stdc++.h>
using namespace std;
int a, b, p[N + 10], ans[N + 10], Ans;
struct node
{
int val, T, id;
bool operator<(const node &o) const
{
return T > o.T;
}
} s[N + 10];
inline void add(int n, int k)
{
for (; n <= a; n += n & -n)
p[n] += k;
}
inline int query(int n)
{
int res = 0;
for (; n; n -= n & -n)
res += p[n];
return res;
}
inline void cdq(int l, int r)
{
if (l == r)
return;
int mid = (l + r) >> 1;
cdq(l, mid);
cdq(mid + 1, r);
sort(s + l, s + r + 1);
int tmp = 0;
for (int i = l; i <= r; i++)
if (s[i].id <= mid)
add(s[i].val, 1), tmp++;
else
{
if (s[i].T != 1e18)
ans[s[i].T] += tmp - query(s[i].val);
// else
// Ans += tmp - query(s[i].val);
}
for (int i = l; i <= r; i++)
if (s[i].id <= mid)
add(s[i].val, -1);
for (int i = l; i <= r; i++)
if (s[i].id > mid)
add(s[i].val, 1);
else
{
if (s[i].T != 1e18)
ans[s[i].T] += query(s[i].val);
// else
// Ans += query(s[i].val);
}
for (int i = l; i <= r; i++)
if (s[i].id > mid)
add(s[i].val, -1);
}
signed main()
{
freopen("in1.in", "r", stdin);
a = read();
b = read();
for (int i = 1; i <= a; i++)
s[i].val = read(), s[i].T = 1e18, s[i].id = i;
for (int i = 1; i <= b; i++)
s[read()].T = i;
int tmp = 0;
for (int i = 1; i <= a; i++)
if (s[i].T == 1e18)
Ans += tmp - query(s[i].val), add(s[i].val, 1), tmp++;
memset(p, 0, sizeof(p));
cdq(1, a);
for (int i = b; i >= 1; i--)
ans[i] += ans[i + 1];
for (int i = 1; i <= b; i++)
printf("%lld\n", ans[i] + Ans);
return 0;
}
第一个数据点和标准答案就差一点,但实在找不到哪里错了QwQ