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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| #include <bits/stdc++.h> #define x first #define y second #define mp make_pair #define pb push_back
using namespace std;
typedef long long LL; typedef pair<int, int> pii; template <typename T> inline int Chkmax (T &a, T b) {return a < b ? a = b, 1 : 0;} template <typename T> inline int Chkmin (T &a, T b) {return a > b ? a = b, 1 : 0;} template <typename T> T read() { int fl = 1, sum = 0; char ch = getchar(); while (ch < '0' || ch > '9') {if (ch == '-') fl = -1; ch = getchar();} while (ch >= '0' && ch <= '9') sum = sum * 10 + ch - '0', ch = getchar(); return sum * fl; }
const int Maxn = 5e5 + 100, inf = 0x3f3f3f3f;
int N, M, A[Maxn]; vector <pii> Q[Maxn];
namespace SEG { pii Tree[Maxn << 2];
inline void push_up (int root) { Tree[root] = min(Tree[root << 1], Tree[root << 1 | 1]); }
inline void update (int root, int l, int r, int x, pii v) { if (l == r) { Tree[root] = v; return ; } int mid = (l + r) >> 1; if (x <= mid) update (root << 1, l, mid, x, v); else update (root << 1 | 1, mid + 1, r, x, v); push_up(root); }
inline pii query (int root, int l, int r, int x, int y) { if (l > y || r < x) return {inf, inf}; if (x <= l && r <= y) return Tree[root]; int mid = (l + r) >> 1; pii ans = {inf, inf}; if (x <= mid) ans = min(ans, query (root << 1, l, mid, x, y)); if (y > mid) ans = min(ans, query (root << 1 | 1, mid + 1, r, x, y)); return ans; } }
inline void Input() { N = read<int>(); for (int i = 1; i <= N; ++i) A[i] = read<int>(); M = read<int>(); for (int i = 1; i <= M; ++i) { int x = read<int>(), y = read<int>(); Q[y].pb({x, i}); } }
pii Pre[Maxn]; int id[Maxn], Ans[Maxn];
int main() { #ifdef hk_cnyali freopen("F.in", "r", stdin); freopen("F.out", "w", stdout); #endif Input();
for (int i = 1; i <= N; ++i) { Pre[i] = {id[A[i]], A[i]}; id[A[i]] = i; } for (int i = 1; i <= N; ++i) { if (Pre[i].x) SEG :: update(1, 1, N, Pre[i].x, {inf, inf}); SEG :: update(1, 1, N, i, Pre[i]); for (int j = 0; j < Q[i].size(); ++j) { pii x = Q[i][j], ans = SEG :: query(1, 1, N, x.x, i); if (ans.x < x.x) Ans[x.y] = ans.y; } } for (int i = 1; i <= M; ++i) printf("%d\n", Ans[i]); return 0; }
|