#include <stdio.h>
#define treeSize 131072
#define Nadejde 100000
struct pair {
int b, e, init;
pair() {
}
bool operator < (pair &other) {
return this -> b < other.b;
}
};
int N, Q, max;
pair sorted[Nadejde + 1];
int next[Nadejde + 1];
int dist[Nadejde + 1];
int last[Nadejde];
int tree[2 * treeSize];
int answer[Nadejde + 1];
void sort(int begin, int end) {
int b = begin, e = end;
pair tmp, pivot = sorted[(b + e) / 2];
while (b <= e) {
while (sorted[b] < pivot) {
b++;
}
while (pivot < sorted[e]) {
e--;
}
if (b <= e) {
tmp = sorted[b];
sorted[b++] = sorted[e];
sorted[e--] = tmp;
}
}
if (begin < e) {
sort(begin, e);
}
if (b < end) {
sort(b, end);
}
}
int MAX(int X, int Y) {
return X > Y ? X : Y;
}
void build(int u, int left, int right) {
if (left == right) {
tree[u] = dist[left];
return;
}
int mid = (left + right) / 2;
build(2 * u, left, mid);
build(2 * u + 1, mid + 1, right);
tree[u] = MAX(tree[2 * u], tree[2 * u + 1]);
}
void update(int u, int left, int right, int a) {
if (left == right) {
tree[u] = 0;
return;
}
int mid = (left + right) / 2;
if (a <= mid) {
update(2 * u, left, mid, a);
} else {
update(2 * u + 1, mid + 1, right, a);
}
tree[u] = MAX(tree[2 * u], tree[2 * u + 1]);
}
void query(int u, int left, int right, int a, int b) {
if (a <= left && right <= b) {
if (tree[u] > max) {
max = tree[u];
}
return;
}
int mid = (left + right) / 2;
if (a <= mid) {
query(2 * u, left, mid, a, b);
}
if (b > mid) {
query(2 * u + 1, mid + 1, right, a, b);
}
}
int main(void) {
int i, j, k, x;
FILE *f = fopen("pq.in", "r");
/* Citirea datelor. */
fscanf(f, "%d %d", &N, &Q);
for (i = 1; i <= N; i++) {
fscanf(f, "%d", &x);
if (last[x]) {
dist[i] = i - last[x];
next[last[x]] = i;
}
last[x] = i;
}
for (i = 1; i <= Q; i++) {
fscanf(f, "%d %d", &sorted[i].b, &sorted[i].e);
sorted[i].init = i;
}
fclose(f);
/* Initializarea datelor. */
sort(1, Q);
build(1, 1, N);
/* Calcularea solutiei. */
i = 1;
while (i <= Q) {
j = i;
while (j <= Q && sorted[i].b == sorted[j].b) {
max = 0;
query(1, 1, N, sorted[j].b, sorted[j].e);
answer[sorted[j].init] = max;
j++;
}
if (j <= Q) {
for (k = sorted[i].b; k < sorted[j].b; k++) {
if (next[k]) {
update(1, 1, N, next[k]);
}
}
}
i = j;
}
/* Afisarea solutiei. */
freopen("pq.out", "w", stdout);
for (i = 1; i <= Q; i++) {
fprintf(stdout, "%d\n", answer[i] == 0 ? -1 : answer[i]);
}
fclose(stdout);
/// Multumim Doamne!
puts("Doamne ajuta!");
return 0;
}