0
1
mirror of https://git.sb/baoshuo/OI-codes.git synced 2024-12-05 02:26:26 +00:00
OI-codes/Luogu/P3157/P3157.cpp

119 lines
2.1 KiB
C++

#include <algorithm>
#include <iostream>
using std::cin;
using std::cout;
const char endl = '\n';
const int N = 1e5 + 5;
int n, m, pos[N];
long long c[N], ans[N];
struct node {
int t, i, v;
node() {}
node(int _t, int _i, int _v)
: t(_t), i(_i), v(_v) {}
bool operator<(const node& x) {
return i == x.i ? v < x.v : i < x.i;
}
} q[N], w[N];
inline int lowbit(int x) {
return x & -x;
}
void add(int x, int y) {
for (; x <= n; x += lowbit(x)) c[x] += y;
}
int sum(int x) {
int res = 0;
for (; x; x -= lowbit(x)) res += c[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);
int i = l, j = mid + 1, k = 0;
while (i <= mid && j <= r) {
if (q[i] < q[j]) {
add(q[i].v, 1);
w[++k] = q[i++];
} else {
ans[q[j].t] += sum(n) - sum(q[j].v);
w[++k] = q[j++];
}
}
while (i <= mid) {
add(q[i].v, 1);
w[++k] = q[i++];
}
while (j <= r) {
ans[q[j].t] += sum(n) - sum(q[j].v);
w[++k] = q[j++];
}
for (int i = l; i <= mid; i++) add(q[i].v, -1);
for (int i = l, j = 1; j <= k; i++, j++) q[i] = w[j];
for (int i = r; i >= l; i--) {
if (q[i].t <= mid) {
add(q[i].v, 1);
} else {
ans[q[i].t] += sum(q[i].v);
}
}
for (int i = r; i >= l; i--) {
if (q[i].t <= mid) add(q[i].v, -1);
}
}
int main() {
std::ios::sync_with_stdio(false);
cin >> n >> m;
for (int i = 1, x; i <= n; i++) {
cin >> x;
pos[x] = i;
q[i] = node(0, i, x);
}
int t = n;
for (int i = 1, x; i <= m; i++) {
cin >> x;
q[pos[x]].t = t--;
}
for (int i = 1; i <= n; i++) {
if (!q[i].t) q[i].t = t--;
}
std::sort(q + 1, q + 1 + n, [&](const node& a, const node& b) {
return a.t < b.t;
});
solve(1, n);
for (int i = 1; i <= n; i++) ans[i] += ans[i - 1];
for (int i = n; i > n - m; i--) {
cout << ans[i] << endl;
}
return 0;
}