#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;
ifstream fin("pq.in");
ofstream fout("pq.out");
int n,i,q,j;
int l[100001],r[100001],aux[100001],a[100001],sol[100001];
int h[400001];
struct intrebare{
int l,r,idx;
}v[100001];
bool cmp(intrebare a, intrebare b){
return a.l<b.l;
}
void update(int nod, int l, int r, int poz, int val)
{
if(l==r) h[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);
h[nod]=max(h[2*nod],h[2*nod+1]);
}
}
int query(int nod, int l, int r, int st, int dr)
{
int aux1=0, aux2=0;
if(l>=st && r<=dr) return h[nod];
else
{
int mid=(l+r)/2;
if(st<=mid) aux1=query(2*nod,l,mid,st,dr);
if(dr>mid) aux2=query(2*nod+1, mid+1,r,st,dr);
}
return max(aux1,aux2);
}
int main()
{
fin>>n>>q;
for(i=1;i<=n;++i) fin>>a[i];
for(i=1;i<=q;++i) fin>>v[i].l>>v[i].r,v[i].idx=i;
for(i=1;i<=n;++i)
{
if(aux[a[i]]==0) aux[a[i]]=i;
l[i]=aux[a[i]];
aux[a[i]]=i;
}
memset(aux,sizeof(aux),0);
for(i=n;i>=1;--i)
{
if(aux[a[i]]==0) aux[a[i]]=0;
r[i]=aux[a[i]];
aux[a[i]]=i;
}
sort(v+1,v+q+1,cmp);
for(i=1;i<=n;++i)
{
update(1,1,n,i,i-l[i]);
}
j=1;
for(i=1;i<=n;++i)
{
while(j<=q && v[j].l==i)
{
sol[v[j].idx]=query(1,1,n,v[j].l,v[j].r);
++j;
}
update(1,1,n,r[i],-1);
}
for(i=1;i<=q;++i) if(sol[i]>0) fout<<sol[i]<<"\n";
else fout<<"-1"<<"\n";
return 0;
}