#include <bits/stdc++.h>
#define nl '\n'
#define pb push_back
#define ll long long
#define VMAX 100001
#define NMAX 100005
#define INF -100000000000000000
using namespace std;
ifstream f("pq.in");
ofstream g("pq.out");
int N,Q,prec[100005],lst[100005];
vector<pair<int,int> > queryes[100005];
int aint[400005],answer[400005];
void update(int nod,int st,int dr,int poz,int val)
{
if(st==dr)
{
aint[nod]=max(aint[nod],val);
return;
}
int mij=(st+dr)/2;
if(poz<=mij)
{
update(2*nod,st,mij,poz,val);
}
else
{
update(2*nod+1,mij+1,dr,poz,val);
}
aint[nod]=max(aint[2*nod],aint[2*nod+1]);
//cout<<nod<<" "<<aint[nod]<<'\n';
}
int query(int nod,int st,int dr,int qst,int qdr)
{
if(qst<=st&&dr<=qdr)
{
return aint[nod];
}
int mij=(st+dr)/2;
int Mx=-1;
if(qst<=mij)
{
Mx=max(query(2*nod,st,mij,qst,qdr),Mx);
}
if(qdr>mij)
{
Mx=max(query(2*nod+1,mij+1,dr,qst,qdr),Mx);
}
return Mx;
}
int main()
{
f>>N>>Q;
for(int i=1;i<=N;i++)
{
int x;
f>>x;
prec[i]=lst[x];
lst[x]=i;
}
memset(aint,-1,sizeof(aint));
for(int i=1;i<=Q;i++)
{
int l,r;
f>>l>>r;
queryes[r].push_back({l,i});
}
for(int i=1;i<=N;i++)
{
//cout<<i-prec[i]<<'\n';
if(prec[i]) update(1,1,N,prec[i],i-prec[i]);
for(auto x:queryes[i])
{
answer[x.second]=query(1,1,N,x.first,i);
}
}
//cout<<'\n';
for(int i=1;i<=Q;i++)
{
g<<answer[i]<<'\n';
}
}