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
| #include <bits/stdc++.h>
using namespace std;
typedef long long ll; const int maxn = 5e5 + 10; const int mod = 1e9 + 7;
inline int __read() { int x(0), t(1); char o (getchar()); while (o < '0' || o > '9') { if (o == '-') t = -1; o = getchar(); } for (; o >= '0' && o <= '9'; o = getchar()) x = (x << 1) + (x << 3) + (o ^ 48); return x * t; }
int n, m, cnt, cur; int a[maxn], d[maxn], p[maxn], f[maxn][25]; int __prev[maxn], __last[maxn], __log[maxn] = {-1}; map <int, int> Vis;
inline int _lower_bound(int x) { int l(1), r(cur), ans(cur + 1); while (l <= r) { int mid((l + r) >> 1); if (__prev[mid] < x) l = mid + 1; else ans = mid, r = mid - 1; } return ans; }
inline int _upper_bound(int x) { int l(1), r(cur), ans(cur + 1); while (l <= r) { int mid((l + r) >> 1); if (__last[mid] <= x) l = mid + 1; else ans = mid, r = mid - 1; } return ans - 1; }
inline int min__(int a, int b) { return a < b ? a : b; }
signed main() { n = __read(), m = __read(); for (int i(1); i <= n; ++i) { int temp = __read(); if (!Vis[temp]) Vis[temp] = ++cnt; a[i] = Vis[temp]; int j = p[a[i]]; p[a[i]] = i; if (__prev[cur] >= j) continue; __prev[++cur] = j, __last[cur] = i, d[cur] = i - j; } for (int i(1); i <= cur; ++i) f[i][0] = d[i], __log[i] = __log[i >> 1] + 1; for (int j(1); (1 << j) <= cur; ++j) for (int i(1); i + (1 << j) - 1 <= cur; ++i) f[i][j] = min__(f[i][j - 1], f[i + (1 << j - 1)][j - 1]); while (m--) { int x = _lower_bound(__read()), y = _upper_bound(__read()); if (y < x) { puts("-1"); continue; } int len = __log[y - x + 1]; printf ("%d\n", min__(f[x][len], f[y - (1 << len) + 1][len])); } system("pause"); }
|