提交时间:2024-08-28 19:31:56
运行 ID: 31978
#include <bits/stdc++.h> #define int long long #define pii pair<int,int> #define mkp make_pair #define push_back emplace_back using namespace std; inline int read() { int fl = 1, x; char c = getchar(); while (c < '0' || c > '9') { if (c == '-') fl = -1; c = getchar(); } while (c >= '0' && c <= '9') x = (x << 1) + (x << 3) + (c ^ 48), c = getchar(); return fl * x; } int n, q, a[2000005], c[2][2000005], r[2000005]; inline int lb(int x) { return x & (-x); } inline void upd(int x, int y, int mod) { for (int i = x; i <= n; i += lb(i)) c[mod][i] += y; } inline int qry(int x, int mod) { int res = 0; for (int i = x; i >= 1; i -= lb(i)) res += c[mod][i]; return res; } inline int nxd() { for (int i = n; i >= 1; i--) { c[1][i] += qry(a[i] - 1, 0); r[i] += c[1][i]; upd(a[i], 1, 0); } } inline void build() { for (int i = 1; i <= n; i++) { if (i + lb(i) <= n) { c[1][i + lb(i)] += c[1][i]; } } } bool stolylorz[500005]; signed main() { scanf("%lld %lld", &n, &q); for (int i = 1; i <= n; i++) scanf("%lld", &a[i]); nxd(); build(); while (q--) { int x; scanf("%lld", &x); for (int i = x; i <= n; i++) { if (a[i] <= a[x]) { if (!stolylorz[i]) { stolylorz[i] = 1; upd(i, -r[i], 1); } } } printf("%lld\n", qry(n, 1)); } return 0; }