rt,洛谷上过了,uva的多组数据直接WA了
到底还要哪里没有清空啊啊啊QAQ
#include <cstdio>
using namespace std;
const int N = 2e5 + 5;
const int S = N << 9;
#define lbt(x) (x & (-x))
#define mid ((l + r) >> 1)
int n, m;
int val[N], loc[N];
long long cnt = 0ll;
int root[N];
int lc[S], rc[S];
int size[S];
int total = 0;
void modify(int& x, int l, int r, int p, int v) {
if (!x) x = ++total;
size[x] += v;
if (l == r) return;
if (p <= mid) modify(lc[x], l, mid, p, v);
else modify(rc[x], mid + 1, r, p, v);
}
int node[2][N];
inline int get(int l, int r, int x, bool tag) {
int cnt[2] = {0, 0}, ret = 0;
for (register int p = r; p; p -= lbt(p)) node[0][++cnt[0]] = root[p];
for (register int p = l - 1; p; p -= lbt(p)) node[1][++cnt[1]] = root[p];
for (l = 1, r = n; l != r; )
if (x > mid) {
if (tag) {
for (register int i = 1; i <= cnt[0]; i++) ret += size[lc[node[0][i]]];
for (register int i = 1; i <= cnt[1]; i++) ret -= size[lc[node[1][i]]];
}
for (register int i = 1; i <= cnt[0]; i++) node[0][i] = rc[node[0][i]];
for (register int i = 1; i <= cnt[1]; i++) node[1][i] = rc[node[1][i]];
l = mid + 1;
} else {
if (!tag) {
for (register int i = 1; i <= cnt[0]; i++) ret += size[rc[node[0][i]]];
for (register int i = 1; i <= cnt[1]; i++) ret -= size[rc[node[1][i]]];
}
for (register int i = 1; i <= cnt[0]; i++) node[0][i] = lc[node[0][i]];
for (register int i = 1; i <= cnt[1]; i++) node[1][i] = lc[node[1][i]];
r = mid;
}
return ret;
}
void clear(int x) {
if (!x) return;
clear(lc[x]), clear(rc[x]);
lc[x] = rc[x] = size[x] = 0;
}
signed main() {
while (scanf("%d%d", &n, &m) != EOF) {
for (register int i = 1; i <= n; i++)
clear(root[i]), root[i] = 0, loc[i] = val[i] = 0;
total = 0;
for (register int i = 1; i <= n; i++) {
scanf("%d", val + i), loc[val[i]] = i;
cnt += get(1, i - 1, val[i], 0);
for (register int p = i; p <= n; p += lbt(p))
modify(root[p], 1, n, val[i], 1);
}
for (register int x; m; --m) {
scanf("%d", &x);
printf("%lld\n", cnt);
cnt -= get(1, loc[x] - 1, x, 0);
cnt -= get(loc[x] + 1, n, x, 1);
for (register int p = loc[x]; p <= n; p += lbt(p))
modify(root[p], 1, n, x, -1);
}
}
return 0;
}