#include <bits/stdc++.h>
using namespace std;
int n, q;
int a[100005];
int f[100005];
struct query{
int l, r, p;
bool operator < (const query &aux)const{
return r < aux.r;
}
};
struct usu{
int urm, p;
bool operator < (const usu &aux)const{
return urm < aux.urm;
}
};
query Q[100005];
usu b[100005];
int ans[100005];
int Arb[400005];
inline void Build(int st, int dr, int nod){
if(st == dr){
Arb[nod] = b[st].urm - b[st].p;
return ;
}
int mij = (st + dr) / 2;
Build(st, mij, nod * 2);
Build(mij + 1, dr, nod * 2 + 1);
Arb[nod] = max(Arb[nod * 2], Arb[nod * 2 + 1]);
}
inline void Update(int st, int dr, int nod, int pos){
if(st == dr){
Arb[nod] = 0;
return ;
}
int mij = (st + dr) / 2;
if(pos <= mij) Update(st, mij, nod * 2, pos);
else Update(mij + 1, dr, nod * 2 + 1, pos);
Arb[nod] = max(Arb[nod * 2], Arb[nod * 2 + 1]);
}
inline int Query(int st, int dr, int nod, int x, int y){
if(x <= st && dr <= y) return Arb[nod];
int mij = (st + dr) / 2;
int Sol = 0;
if(mij >= x) Sol = Query(st, mij, nod * 2, x, y);
if(mij + 1 <= y) Sol = max(Query(mij + 1, dr, nod * 2 + 1, x, y), Sol);
return Sol;
}
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", &a[i]);
for(int i = 1; i <= q ; ++i){
scanf("%d%d", &Q[i].l, &Q[i].r);
Q[i].p = i;
}
for(int i = n; i >= 1 ; --i){
b[i].p = i;
b[i].urm = i;
if(f[a[i]]) b[i].urm = f[a[i]];
f[a[i]] = i;
}
Build(1, n, 1);
sort(b + 1, b + n + 1);
sort(Q + 1, Q + q + 1);
int j = n;
for(int i = q; i >= 1 ; --i){
while(j > 0 && b[j].urm > Q[i].r){
Update(1, n, 1, b[j].p);
--j;
}
ans[Q[i].p] = Query(1, n, 1, Q[i].l, Q[i].r);
if(ans[Q[i].p] == 0) ans[Q[i].p] = -1;
}
for(int i = 1; i <= q ; ++i)
printf("%d\n", ans[i]);
return 0;
}