#include <stdio.h>
#include <string.h>
#include <algorithm>
#define oo 0x3f3f3f3f
#define NMax 100010
using namespace std;
int N, Q;
int v[NMax], p[NMax];
int arb[NMax * 6];
int r[NMax];
int vals[NMax];
struct query_t {
int x;
int y;
int res;
int index;
bool operator< ( const query_t & other ) const {
return y < other.y || y == other.y && x < other.x;
}
} q[NMax];
int query(int pos, int st, int dr, int x, int y) {
if ( x <= st && dr <= y )
return arb[pos];
int ret = -oo;
int m = (st + dr) / 2;
if ( x <= m )
ret = max(ret, query(2 * pos, st, m, x, y));
if ( y > m )
ret = max(ret, query(2 * pos + 1, m + 1, dr, x, y));
return ret;
}
void update(int pos, int st, int dr, int x, int val ) {
if ( st == dr ) {
arb[pos] = val;
return;
}
int m = (st + dr) / 2;
if ( x <= m )
update(2 * pos, st, m, x, val);
else
update(2 * pos + 1, m + 1, dr, x, val);
arb[pos] = max(arb[2 * pos], arb[2 * pos + 1]);
}
int main() {
freopen("pq.in", "r", stdin);
freopen("pq.out", "w", stdout);
scanf("%d%d", &N, &Q);
for ( int i = 1; i <= N; ++ i )
scanf("%d", &v[i]);
for ( int i = 1; i <= Q; ++ i ) {
scanf("%d%d", &q[i].x, &q[i].y);
q[i].index = i;
}
sort(q + 1, q + Q + 1);
int pos = 1;
for ( int i = 0; i < 6 * NMax; ++ i )
arb[i] = - oo;
memset(vals, 0x3f, sizeof(vals));
for ( int y = 1; y <= N; ++ y ) {
int val = oo;
if ( p[v[y]] )
val = vals[p[v[y]]];
if ( p[v[y]] && val > y - p[v[y]] ) {
update(1, 1, N, p[v[y]], y - p[v[y]] );
vals[p[v[y]]] = y - p[v[y]];
}
p[v[y]] = y;
for (; pos <= Q && q[pos].y == y; ++ pos ) {
q[pos].res = query(1, 1, N, q[pos].x, q[pos].y);
r[q[pos].index] = q[pos].res;
}
}
for ( int i = 1; i <= Q; ++ i )
printf("%d\n", r[i] == -oo ? -1 : r[i]);
return 0;
}