#include<fstream>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef struct {
int x,y,idx;
} qry;
int lft[100005], rght[100005], aint[400005];
int i,j,n,m;
int a[100005],sol[100005],last[100005];
qry q[100005];
bool cmp(qry a, qry b) {
return a.x<b.x;
}
void update(int nod, int l, int r, int poz, int val) {
if (l==r) aint[nod]=val;
else {
int mid=(l+r)/2;
if (poz<=mid) update(2*nod,l,mid,poz,val);
else update(2*nod+1,mid+1,r,poz,val);
aint[nod]=max(aint[2*nod], aint[2*nod+1]);
}
}
int query(int nod, int l ,int r, int x, int y) {
if (l>=x && r<=y) return aint[nod];
else {
int mid=(l+r)/2;
int vl=0, vr=0;
if (x<=mid) vl=query(2*nod,l,mid,x,y);
if (y>mid) vr=query(2*nod+1,mid+1,r,x,y);
return max(vl,vr);
}
}
int main(void) {
ifstream cin("pq.in");
ofstream cout("pq.out");
cin>>n>>m;
for (i=1; i<=n; ++i) cin>>a[i];
for (i=1; i<=m; ++i) {
cin>>q[i].x>>q[i].y;
q[i].idx=i;
}
//
for (i=1; i<=n; ++i) {
if (last[a[i]]==0) last[a[i]]=i;
lft[i]=last[a[i]];
last[a[i]]=i;
}
memset(last,0,sizeof(last));
for (i=n; i>=1; --i) {
if (last[a[i]]==0) last[a[i]]=i;
rght[i]=last[a[i]];
last[a[i]]=i;
}
//
sort(q+1,q+m+1,cmp);
//
for (i=1; i<=n; ++i) update(1,1,n,i,i-lft[i]);
//
int j=1;
for (i=1; i<=n && j<=m; ++i){
while (q[j].x==i&&j<=m) {
sol[q[j].idx]=query(1,1,n,q[j].x,q[j].y);
++j;
}
update(1,1,n,rght[i],0);
}
for (i=1; i<=m; ++i) {
if (sol[i]==0) sol[i]=-1;
cout<<sol[i]<<"\n";
}
return 0;
}