#include<fstream>
#include<vector>
#include<string>
#include<algorithm>
#define modulo 666013
using namespace std;
ifstream fin("pq.in");
ofstream fout("pq.out");
const int NMAX = 100005;
struct Query
{
int st, dr, index;
};
Query a[NMAX];
string sir;
int i, n, k, j,contor,st,dr,sol,x,y,query;
int v[NMAX], last[NMAX], pos[NMAX], result[NMAX];
int MaxArb[4 * NMAX];
bool cmp(Query a, Query b)
{
return a.st < b.st;
}
void queryAI(int nod, int start, int end, int l, int r) {
if (l <= start && r >= end)
{
sol = max(sol, MaxArb[nod]);
return;
}
int mij = (start + end) / 2;
int m1 = 0, m2 = 0;
if(l <= mij)
queryAI(2 * nod, start, mij, l, r);
if(mij < r)
queryAI(2 * nod + 1, mij + 1, end, l, r);
}
void update(int nod, int start, int end, int position, int value) {
if (start == end) {
MaxArb[nod] = value;
return;
}
int mid = (start + end) / 2;
if ( position <= mid) {
update(2 * nod, start, mid, position, value);
} else {
update(2 * nod + 1, mid + 1, end, position, value);
}
MaxArb[nod] = max(MaxArb[2 * nod], MaxArb[2 * nod + 1]);
}
int main()
{
fin >> n >> query;
for(i = 1; i <= n; i++)
{
fin >> v[i];
}
for(i = 1; i <= query; i++)
{
fin >> a[i].st >> a[i].dr;
a[i].index = i;
}
sort(a + 1, a + query + 1, cmp);
for(i = 1; i <= query; i++)
{
//fout << a[i].st << " " << a[i].dr << " " << a[i].index << "\n";
}
st = dr = a[1].st;
for(i = 1; i <= query; i++)
{
while(dr <= a[i].dr)
{
int nr = v[dr];
if(last[nr] != 0 && last[nr] >= a[i].st)
{
//fout << nr <<" "<<last[nr] <<" "<<dr<<"\n";
update(1, 1, n, dr, dr - last[nr]);
pos[last[nr]] = dr;
}
last[nr] = dr;
dr++;
}
while(st < a[i].st)
{
if(pos[st] != 0)
{
update(1, 1, n, pos[st], 0);
}
st++;
}
sol = 0;
queryAI(1, 1, n, a[i].st, a[i].dr);
if(sol == 0)
{
result[a[i].index] = -1;
//fout << "-1\n";
}
else
{
result[a[i].index] = sol;
//fout << sol <<"\n";
}
// fout << queryAI(1, 1, n, a[i].st, a[i].dr)
//fout << j <<"\n";
}
//fout <<"------\n";
for(i = 1; i <= query; i++)
{
fout << result[i] <<"\n";
}
for(i = 1; i < 2*n; i++)
{
//fout << MaxArb[i] <<" ";
}
}