#include <fstream>
#include <algorithm>
#include <iostream>
using namespace std;
struct qwery
{
int st,dr,poz,rez;
bool operator < (const qwery &a) const
{
if(a.st<st) return 1;
else if(a.st==st)
{
return a.dr<dr;
}
else return 0;
}
} q[100005];
bool comp(const qwery &a,const qwery &b)
{
return a.poz<b.poz;
}
int x[100005];
int last_pos[100005];
int qs,n;
int index;
struct inter
{
int st,dr,len;
} inter[100005];
int arbint[400005];
void update(int st,int dr,int poz,int nod,int val)
{
if(st==dr && st==poz)
{
arbint[nod]=val; return ;
}
int mid=(st+dr)/2;
if( poz<=mid ) update(st,mid,poz,2*nod,val);
else update(mid+1,dr,poz,2*nod+1,val);
arbint[nod]=max( arbint[2*nod], arbint[2*nod+1]);
}
int qwery(int st,int dr,int a,int b,int nod)
{
if( st>=a && dr<=b) return arbint[nod];
int maxi=-1,mid=(st+dr)/2;
if( a<=mid ) maxi=max(maxi,qwery(st,mid,a,b,2*nod));
if(b>mid) maxi=max( maxi, qwery(mid+1,dr,a,b,2*nod+1));
return maxi;
}
int main()
{
int i;
ifstream t1("pq.in");
ofstream t2("pq.out");
t1>>n>>qs;
for(i=1;i<=n;i++) t1>>x[i];
for(i=1;i<=qs;i++)
{
t1>>q[i].st>>q[i].dr; q[i].poz=i;
}
for(i=n;i>=1;i--)
{
if(last_pos[ x[i] ])
{
index++;
inter[index].st=i; inter[index].dr=last_pos[ x[i]];
inter[index].len=inter[index].dr- inter[index].st;
update(1,n,inter[index].dr,1,inter[index].len);
}
last_pos[ x[i]]=i;
}
int sol;
for(i=1;i<=qs;i++)
{
while(inter[index].st< q[i].st)
{
update(1,8,inter[index].dr,1,0);
index--;
}
sol=qwery(1,8,1,q[i].dr,1);
if(!sol) q[i].rez=-1;
else q[i].rez=sol;
}
sort(q+1,q+qs+1,comp);
for(i=1;i<=qs;i++) t2<<q[i].rez<<'\n';
t1.close();
t2.close();
return 0;
}