#include<bits/stdc++.h>
#define maxN 100001
using namespace std;
int arb[4*maxN];
int q,n;
int ans[maxN],arr[maxN],lastApparition[maxN];
vector<pair<int,int>> queries[maxN];
void update(int nod,int st,int dr,int pos,int val){
if(st == dr){
arb[nod]=max(val,arb[nod]);
return;
}
int mid=(st+dr)>>1;
int nextNode=(nod << 1);
if(pos <= mid){
update(nextNode,st,mid,pos,val);
}
else{
update(nextNode+1,mid+1,dr,pos,val);
}
arb[nod]=max(arb[nextNode],arb[nextNode+1]);
}
int query(int nod,int st,int dr,int qst,int qdr){
if(st > qdr || dr < qst){
return 0;
}
if(qst <= st && qdr >= dr){
return arb[nod];
}
int nextNode=(nod<<1);
int mid=(st+dr)>>1;
return max(query(nextNode,st,mid,qst,qdr),query(nextNode+1,mid+1,dr,qst,qdr));
}
int main(){
cin >> n >> q;
for(int i=1;i<=n;i++){
cin >> arr[i];
}
int x,y;
for(int i=0;i<q;i++){
cin >> x >> y;
queries[y].push_back(make_pair(x,i));
}
for(int i=1;i<=n;i++){
if(lastApparition[arr[i]]!=0){
update(1,1,n,lastApparition[arr[i]],i-lastApparition[arr[i]]);
}
lastApparition[arr[i]]=i;
for(int j=0;j<queries[i].size();j++){
ans[queries[i][j].second]=query(1,1,n,queries[i][j].first,i);
}
}
for(int i=0;i<q;i++){
if(ans[i] == 0){
cout << -1 << '\n';
}
else{
cout << ans[i] << '\n';
}
}
return 0;
}