#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream in("pq.in");
ofstream out("pq.out");
const int dim = 100005;
struct event
{
int x;
int y;
int i;
};
vector <event> vec;
int n,a[dim],poz[dim],q,arb[4*dim],rasp = -1,sa_fie[dim];
bool cmp(event a,event b)
{
return (a.y < b.y);
}
void Update(int nod,int st,int dr,int poz,int val)
{
if (st == dr)
{
arb[nod] = val;
return ;
}
int mid = (st+dr)/2;
if (poz <= mid) Update(2*nod, st,mid, poz, val);
else Update(2*nod+1, mid+1,dr,poz,val);
arb[nod] = max(arb[2*nod], arb[2*nod + 1]);
}
void Query(int nod,int st,int dr,int a,int b)
{
if (a <= st && dr <= b)
{
rasp = max(rasp, arb[nod]);
return ;
}
int mid = (st+dr)/2;
if (a <= mid)
{
Query(2*nod,st,mid,a,b);
}
if (b > mid)
{
Query(2*nod +1,mid+1,dr,a,b);
}
}
int main()
{
in >> n >> q;
for (int i=1; i<=n; i++) in >> a[i];
///cout <<"ok\n";
int x,y;
for (int j=1; j<=q; j++)
{
in >> x >> y;
vec.push_back({x,y,j});
}
sort(vec.begin(), vec.end(), cmp);
int j = 0;
for (int i=1; i<=n; i++)
{
if (poz[a[i]])
{
Update(1,1,n,poz[a[i]], i-poz[a[i]]);
}
poz[a[i]] = i;
while(j < q && vec[j].y == i)
{
rasp = -1;
Query(1, 1, n, vec[j].x, vec[j].y);
if (rasp == 0) rasp = -1;
sa_fie[vec[j].i] = rasp;
j++;
}
}
for (int j=1; j<=q; j++)
{
out << sa_fie[j] << "\n";
}
return 0;
}