#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define mt make_tuple
#define ll long long
#define pii pair<int,int>
#define tii tuple <int,int,int>
#define N 200005
#define mod 1000000005
#define X first
#define Y second
#define eps 0.0000000001
#define all(x) x.begin(),x.end()
#define tot(x) x+1,x+n+1
using namespace std;
int sc[N], sol, poz, val, i, arb[N], l, r, n, q, x, p, Ll;
vector<tii>v;
unordered_map<int, int>M, R;
void upd(int nod, int l, int r) {
if(l == r) {
arb[nod] = val;
return;
}
int m = (l + r) / 2;
if(poz <= m)
upd(2 * nod, l, m);
else
upd(2 * nod + 1, m + 1, r);
arb[nod] = max(arb[2 * nod], arb[2 * nod + 1]);
}
void query(int nod, int a, int b) {
if(b <= r) {
sol = max(sol, arb[nod]);
return;
}
if(a > r)
return;
int m = (a + b) / 2;
query(2 * nod, a, m);
query(2 * nod + 1, m + 1, b);
}
int main() {
freopen("pq.in", "r", stdin);
freopen("pq.out", "w", stdout);
scanf("%d%d", &n, &q);
for(i = 1; i <= n; i++) {
cin >> x;
if(M[x]) {
poz = i;
val = i - M[x];
R[M[x]] = i;
upd(1, 1, n);
}
M[x] = i;
}
for(i = 1; i <= q; i++) {
cin >> l >> r;
v.pb(mt(l, r, i));
}
sort(all(v));
x = 1;
Ll = 1;
for(auto it : v) {
tie(l, r, p) = it;
for(i = Ll; i < l; i++) {
poz = R[i];
val = -1;
if(poz)upd(1, 1, n);
}
Ll = l;
sol = -1;
query(1, 1, n);
if(sol == 0)
sol = -1;
sc[p] = sol;
}
for(i = 1; i <= q; i++)
cout << sc[i] << '\n';
return 0;
}