#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
struct query{
int l,r,ind;
};
int N,Q,a[100010],tree[500010],last[100010],ans[100010];
query q[100010];
bool cmp(query A, query B){
return A.r<B.r;
}
void update(int nod, int l, int r, int pos, int val){
if (l==r){
tree[nod]=val;
return;
}
int mid=(l+r)/2;
if (pos<=mid) update(nod*2,l,mid,pos,val);
else update(nod*2+1,mid+1,r,pos,val);
tree[nod]=max(tree[nod*2],tree[nod*2+1]);
}
int query(int nod, int l, int r, int ql, int qr){
if (ql<=l && r<=qr){
return tree[nod];
}
int mid=(l+r)/2,ans=0;
if (ql<=mid) ans=query(nod*2,l,mid,ql,qr);
if (mid<qr) ans=max(ans,query(nod*2+1,mid+1,r,ql,qr));
return ans;
}
int main(){
ifstream fin("pq.in");
ofstream fout("pq.out");
fin >> N >> Q;
int i;
for (i=1; i<=N; i++) fin >> a[i];
for (i=1; i<=Q; i++){
fin >> q[i].l >> q[i].r;
q[i].ind=i;
}
sort(q+1,q+Q+1,cmp);
int l=0,k;
for (k=1; k<=Q; k++){
for (i=l+1; i<=q[k].r; i++){
if (last[a[i]])
update(1,1,N,last[a[i]],i-last[a[i]]);
last[a[i]]=i;
}
l=q[k].r;
ans[q[k].ind]=query(1,1,N,q[k].l,q[k].r);
}
for (i=1; i<=Q; i++)
if (!ans[i]) fout << -1 << "\n";
else fout << ans[i] << "\n";
return 0;
}