1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| const int N = 2e5 + 5; int n, q, a[N], d[N], x[N], y[N]; long long ans[N]; struct query { int l, r, id; long long ans; } qry[N]; vector<tuple<int, int, int, int, int>> vec[N];
struct block { static constexpr int B = 256; int L[N], R[N], belong[N], a[N], b[N]; void init() { for (int i = 1; i <= B; i++) L[i] = N / B * (i - 1) + 1, R[i] = N / B * i; R[B] = N; for (int i = 1; i <= B; i++) fill(belong + L[i], belong + R[i] + 1, i); } void clear() {memset(a, 0, sizeof(a)), memset(b, 0, sizeof(b));} void add(int x) { for (int i = belong[x]; i <= B; i++) a[i]++; for (int i = x; i <= R[belong[x]]; i++) b[i]++; } int ask(int x) {return x <= 0 ? 0 : a[belong[x] - 1] + b[x];} } b;
void _main() { read(n, q), read(a + 1, a + n + 1); copy(a + 1, a + n + 1, d + 1), sort(d + 1, d + n + 1); int tot = unique(d + 1, d + n + 1) - d - 1; for (int i = 1; i <= n; i++) a[i] = lower_bound(d + 1, d + tot + 1, a[i]) - d; b.init(), b.clear(); for (int i = 1; i <= n; i++) x[i] = b.ask(a[i] - 1), y[i] = b.ask(n) - b.ask(a[i]), b.add(a[i]); for (int i = 1; i <= n; i++) mdebug(x[i], y[i]); for (int i = 1; i <= q; i++) read(qry[i].l, qry[i].r), qry[i].id = i; int unit = n / sqrt(q); sort(qry + 1, qry + q + 1, [&](const query& x, const query& y) -> bool { if (x.l / unit != y.l / unit) return x.l < y.l; if ((x.l / unit) & 1) return x.r < y.r; return x.r > y.r; }); for (int i = 1, l = 1, r = 0; i <= q; i++) { int ql = qry[i].l, qr = qry[i].r; long long &cur = qry[i].ans; if (l > ql) vec[r].emplace_back(ql, l - 1, i, 1, -1); while (l > ql) cur -= x[--l]; if (r < qr) vec[l - 1].emplace_back(r + 1, qr, i, -1, 1); while (r < qr) cur += y[++r]; if (l < ql) vec[r].emplace_back(l, ql - 1, i, -1, -1); while (l < ql) cur += x[l++]; if (r > qr) vec[l - 1].emplace_back(qr + 1, r, i, 1, 1); while (r > qr) cur -= y[r--]; } b.clear(); for (int i = 1; i <= n; i++) { b.add(a[i]); for (const auto& info : vec[i]) { int l = get<0>(info), r = get<1>(info), id = get<2>(info), sgn = get<3>(info), lr = get<4>(info); for (int j = l; j <= r; j++) { if (lr == -1) qry[id].ans += sgn * b.ask(a[j] - 1); else qry[id].ans += sgn * (i - b.ask(a[j])); } } } for (int i = 1; i <= q; i++) qry[i].ans += qry[i - 1].ans; for (int i = 1; i <= q; i++) ans[qry[i].id] = qry[i].ans; for (int i = 1; i <= q; i++) writeln(ans[i]); FastIO::flush(); }
|