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
| #include <bits/stdc++.h>
namespace IO using namespace IO; const int Maxn = 1e6 + 10; using namespace std;
struct Stree { int ls, rs, val; #define ls(x) St[x].ls #define rs(x) St[x].rs #define v(x) St[x].val } St[Maxn << 6];
int rt[Maxn], tot;
int add (int p, int l, int r, int v, int k) { int np = ++tot; St[np] = St[p], v(np) += k; if (l == r) return np; int mid = (l + r) >> 1; if (v <= mid) ls(np) = add (ls(p), l, mid, v, k); else rs(np) = add (rs(p), mid + 1, r, v, k); return np; }
int ask (int p, int l, int r, int v) { if (l == r) return v(p); int mid = (l + r) >> 1; if (v <= mid) return ask (ls(p), l, mid, v) + v(rs(p)); else return ask (rs(p), mid + 1, r, v); }
int lst[Maxn];
signed main() { int n = read (); for (int i = 1, tmp, v; i <= n; ++i) { v = read (); if (!lst[v]) rt[i] = add (rt[i - 1], 1, n, i, 1); else tmp = add (rt[i - 1], 1, n, lst[v], -1), rt[i] = add (tmp, 1, n, i, 1); lst[v] = i; } int m = read (); for (int i = 1; i <= m; ++i) { int l = read (), r = read (); print (ask (rt[r], 1, n, l)); } return 0; }
|