#include <cstdio>
#include <algorithm>
const int SIZE = 1e5 + 5;
const int INFI = 0x3f3f3f3f;
int n, m, c, ans[SIZE], v[SIZE], p[SIZE];
struct str{ int x, y, z; } q[SIZE];
int my_tree[SIZE * 4];
void update_tree( int node, int left, int right, int position, int value ) {
if( left > right || right < position || left > position )
return;
if( left == right ) {
my_tree[node] = value;
return;
}
int middle = left + ( right - left ) / 2;
update_tree( node * 2, left, middle, position, value );
update_tree( node * 2 + 1, middle + 1, right, position, value );
my_tree[node] = std::max( my_tree[node * 2], my_tree[node * 2 + 1] );
return;
}
int query_tree( int node, int left, int right, int start, int finish ) {
int answer1 = -INFI, answer2 = -INFI;
if( left > right || left > finish || start > right )
return -1;
if( start <= left && right <= finish )
return my_tree[node];
int middle = left + ( right - left ) / 2;
answer1 = query_tree( node * 2, left, middle, start, finish );
answer2 = query_tree( node * 2 + 1, middle + 1, right, start, finish );
return std::max( answer1, answer2 );
}
void update_tree( int position, int value ) {
update_tree( 1, 1, n, position, value );
return;
}
int query_tree( int start, int finish ) {
return query_tree( 1, 1, n, start, finish );
}
inline bool cmp( str a, str b ) {
return a.y < b.y;
}
int main( int argc, const char *argv[] ) {
freopen( "pq.in" , "r", stdin );
freopen( "pq.out", "w", stdout );
scanf( "%d %d", &n, &m );
for( int i = 1; i <= n; i ++ )
scanf( "%d", &v[i] );
for( int i = 1; i <= m; i ++ ) {
scanf( "%d %d", &q[i].x, &q[i].y );
q[i].z = i;
}
std::sort( q + 1, q + m + 1, cmp );
c = 1;
for( int i = 1; i <= n; i ++ ) {
if( p[ v[i] ] != 0 )
update_tree( p[ v[i] ], i - p[ v[i] ] );
p[ v[i] ] = i;
for( c = c; c <= m && q[c].y <= i; c ++ )
ans[ q[c].z ] = query_tree( q[c].x, q[c].y );
}
for( int i = 1; i <= m; i ++ ) {
if( ans[i] == 0 )
printf( "%d\n", -1 );
else
printf( "%d\n", ans[i] );
}
return 0;
}