#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("pq.in");
ofstream fout("pq.out");
const int VAL=100005;
struct interval
{
int L, R, ind;
};
interval Q[VAL];
bool operator <(const interval &A, const interval &B)
{
return A.L<B.L;
}
int N, M, i, j, last[VAL], mx;
int ARB[4*VAL], nr, scos, ANS[VAL];
vector <int> P[VAL];
vector <int> :: iterator it;
void Initializare(int nod, int be, int en)
{
if (be==en)
{
ARB[nod]=-1;
return;
}
int mid=(be+en) / 2;
Initializare(2*nod, be, mid);
Initializare(2*nod+1, mid+1, en);
ARB[nod]=-1;
}
void Update(int nod, int be, int en, int poz, int X)
{
if (be==en)
{
ARB[nod]=X;
return;
}
int mid=(be+en) / 2;
if (be<=poz && poz<=mid)
Update(2*nod, be, mid, poz, X);
if (mid+1<=poz && poz<=en)
Update(2*nod+1, mid+1, en, poz, X);
ARB[nod]=max(ARB[2*nod], ARB[2*nod+1]);
}
void Query(int nod, int be, int en, int A, int B)
{
if (A<=be && en<=B)
{
mx=max(mx, ARB[nod]);
return;
}
int mid=(be+en) / 2;
if (max(be, A)<=min(mid, B))
Query(2*nod, be, mid, A, B);
if (max(mid+1, A)<=min(en, B))
Query(2*nod+1, mid+1, en, A, B);
}
int main()
{
fin >> N >> M;
Initializare(1, 1, N);
for (i=1; i<=N; i++)
{
fin >> nr;
if (last[nr]!=0)
{
Update(1, 1, N, i, i-last[nr]);
P[last[nr]].push_back(i);
}
last[nr]=i;
}
for (i=1; i<=M; i++)
{
fin >> Q[i].L >> Q[i].R;
Q[i].ind=i;
}
sort(Q+1, Q+M+1);
scos=1;
for (i=1; i<=M; i++)
{
while (scos<Q[i].L)
{
for (it=P[scos].begin(); it!=P[scos].end(); it++)
Update(1, 1, N, *it, -1);
scos++;
}
mx=-1;
Query(1, 1, N, Q[i].L, Q[i].R);
ANS[Q[i].ind]=mx;
}
for (i=1; i<=M; i++)
fout << ANS[i] << '\n';
fin.close();
fout.close();
return 0;
}