#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
int arbint[400100];
int n,q;
int a[100100];
pair<pair<int,int>,int> Q[100100];
int nxt[100100];
int pre[100100];
int ans[100100];
int ap[100100];
void build(int nod, int l, int r)
{
if (l == r) {
arbint[nod] = 0;
return;
}
int mid = (l + r) >> 1;
build(2*nod,l,mid);
build(2*nod+1,mid+1,r);
arbint[nod] = max(arbint[2*nod],arbint[2*nod+1]);
}
void update(int nod, int l, int r, int pos, int val)
{
if (l == r) {
arbint[nod] = val;
return;
}
int mid = (l + r) >> 1;
if (pos <= mid) update(2*nod,l,mid,pos,val);
else update(2*nod+1,mid+1,r,pos,val);
arbint[nod] = max(arbint[2*nod],arbint[2*nod+1]);
}
int query(int nod, int l, int r, int a, int b)
{
if (l == a && r == b) {
return arbint[nod];
}
int mid = (l + r) >> 1;
if (b <= mid) return query(2*nod, l,mid,a,b);
else if (a >mid) return query(2*nod+1,mid+1,r,a,b);
else return max(
query(2*nod,l,mid,a,mid),
query(2*nod+1,mid+1,r,mid+1,b)
);
}
int main()
{
freopen("pq.in","r",stdin);
freopen("pq.out","w",stdout);
cin>>n>>q;
for(int i=1;i<=n;i++) {
scanf("%d", &a[i]);
}
for (int i = 1; i<= n;i++) {
if (ap[a[i]]) {
pre[i] = ap[a[i]];
nxt[ap[a[i]]] = i;
}
ap[a[i]] = i;
}
for(int i=1;i<=q;i++) {
scanf("%d%d",&Q[i].fi.fi,&Q[i].fi.se);
Q[i].se = i;
}
sort(Q+1,Q+q+1);
build(1,1,n);
Q[0].fi.fi = Q[0].fi.se = 1;
int maxR=0;
for(int i = 1; i <= q;i++) {
int l = Q[i].fi.fi, r = Q[i].fi.se;
int prel = Q[i - 1].fi.fi, prer = Q[i - 1].fi.se;
if (maxR < r) {
for(int j = maxR + 1; j <= r; j++) {
if (nxt[j] != 0)
update(1,1,n,nxt[j], nxt[j] - j);
}
maxR = r;
}
for (int j = prel; j < l; j++) {
if (nxt[j])
update(1,1,n,nxt[j],0);
}
int rs = query(1,1,n,l,r);
if (rs == 0) rs = -1;
ans[Q[i].se] = rs;
}
for(int i = 1; i <= q; i++) {
printf("%d\n",ans[i]);
}
return 0;
}