#include <fstream>
#include <algorithm>
#include <iostream>
using namespace std;
ifstream fin ("pq.in");
ofstream fout ("pq.out");
struct Q{
int x, y, poz;
bool operator < ( const Q& ob ) const {
return (y < ob.y) or (y == ob.y and x < ob.x) ;
};
};
void Update( int nod, int l ,int r, int poz, int val);
void Query(int node , int le , int ri , int a , int b);
const int Dim = 1e5 + 1;
Q Qr[Dim];
int Aint[Dim * 4 + 1];
int q,n,A[Dim],ma,Next[Dim],Sol[Dim];
int main() {
fin >> n >> q;
for ( int i = 1; i <= n; ++i)
fin >> A[i];
for (int i = 1; i <= q; ++i )
fin >> Qr[i].x >> Qr[i].y, Qr[i].poz = i;
sort(Qr + 1, Qr + 1 + q);
int current = n;
for ( int i = q; i >= 1; --i) {
while ( Qr[i].x <= current) {
if ( Next[A[current]] ) {
Update(1,1,n,Next[A[current]],Next[A[current]] - current);
}
Next[A[current]] = current;
current--;
}
ma = 0;
Query(1,1,n,Qr[i].x,Qr[i].y);
Sol[Qr[i].poz] = (ma == 0) ? -1:ma;
}
for ( int i = 1; i <= q; ++i)
fout << Sol[i] << "\n";
}
void Update( int nod, int l ,int r, int poz, int val) {
if ( l == r) {
Aint[nod] = val;
return ;
}
int mj = ( l + r ) / 2;
if ( poz <= mj )
Update(nod * 2, l , mj, poz, val);
else
Update(nod * 2 + 1, mj + 1, r, poz, val);
Aint[nod] = max(Aint[nod * 2], Aint[nod * 2 + 1]);
}
void Query(int node , int le , int ri , int a , int b){
if(a <= le and b >= ri) {
ma = max( Aint[node], ma);
return ;
}
int mj = (le + ri) / 2;
if(a <= mj)
Query(2 * node, le , mj, a , b);
if(b > mj)
Query(2 * node + 1, mj + 1 , ri ,a , b);
}