#include<algorithm>
#include<iostream>
#include<fstream>
#include<vector>
#define DN 100100
using namespace std;
fstream fin("pq.in",ios::in),fout("pq.out",ios::out);
int n,q,ai[DN*4],x[DN],maxim,ap[DN];
struct str{int a,b,poz,val;};
vector<str> v;
bool cmp1(str a,str b){
return (a.b<b.b);
}
bool cmp2(str a,str b){
return a.poz<b.poz;
}
void update(int nod,int st,int dr,int poz,int val)
{
if(st==dr && st==poz) ai[nod]=val;
if(dr<poz || poz<st || st==dr) return ;
int m=(st+dr)/2,c1=nod*2,c2=nod*2+1;
update(c1,st,m,poz,val);
update(c2,m+1,dr,poz,val);
ai[nod]=max(ai[c1],ai[c2]);
}
void query(int nod,int st,int dr,int stq,int drq)
{
if(dr<stq || drq<st) return ;
int m=(st+dr)/2,c1=nod*2,c2=nod*2+1;
if(stq<=st && dr<=drq)
{
maxim=max(maxim,ai[nod]);
return ;
}
query(c1,st,m,stq,drq);
query(c2,m+1,dr,stq,drq);
}
int main()
{
int a,b,i,j=1,dist;
fin>>n>>q;
for(i=1;i<=n;i++)
fin>>x[i];
for(i=1;i<=q;i++)
{
fin>>a>>b;
v.push_back({a,b,i,0});
}
sort(v.begin(),v.end(),cmp1);
for(i=0;i<q;i++)
{
a=v[i].a;
b=v[i].b;
for( ;j<=b;j++)
{
if(ap[x[j]]!=0)
{
dist=(j-ap[x[j]]);
update(1,1,n,ap[x[j]],dist);
}
ap[x[j]]=j;
}
maxim=0;
query(1,1,n,a,b);
v[i].val=maxim;
}
sort(v.begin(),v.end(),cmp2);
for(i=0;i<q;i++)
{
if(v[i].val==0)
fout<<"-1\n";
else
fout<<v[i].val<<"\n";
}
}