#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("pq.in");
ofstream g("pq.out");
int Res[100005], N, Q;
int A[100005], Next[100005];
pair <int, int> I[100005];
int Ord[100005], Last[100005];
int Arb[400005];
bool cmp(int a, int b){
return I[a] < I[b];
}
void update(int K, int L, int R, int pos, int val){
if(L > R)
return;
if(L == R){
Arb[K] = val;
return;
}
if(pos > (L + R) / 2)
update(K * 2 + 1, (L + R) / 2 + 1, R, pos, val);
else
update(K * 2, L, (L + R) / 2, pos, val);
Arb[K] = max(Arb[K * 2], Arb[K * 2 + 1]);
}
int query(int K, int L, int R, int x, int y){
if(L > R || L > y || R < x)
return -1;
if(L >= x && R <= y)
return Arb[K];
return max(query(K * 2, L, (L + R) / 2, x, y), query(K * 2 + 1, (L + R) / 2 + 1, R, x, y));
}
void Read(){
f >> N >> Q;
for(int i = 1; i <= N; i++){
f >> A[i];
}
for(int i = 1; i <= Q; i++){
f >> I[i].first >> I[i].second;
Ord[i] = i;
}
sort(Ord + 1, Ord + Q + 1);
}
void precalcNext(){
for(int i = 1; i <= N; i++){
if(Last[A[i]] != 0)
Next[Last[A[i]]] = i;
Last[A[i]] = i;
}
}
void Solve(){
for(int i = 1; i <= N; i++){
if(Next[i] != 0)
update(1, 1, N, Next[i], Next[i] - i);
}
int left = 1;
for(int i = 1; i <= Q; i++){
int x = Ord[i];
while(left < I[x].first){
if(Next[left] != 0)
update(1, 1, N, Next[left], -1);
++left;
}
Res[Ord[i]] = query(1, 1, N, I[x].first, I[x].second);
}
for(int i = 1; i <= Q; i++){
if(Res[i] == 0)
Res[i] = -1;
g << Res[i] << '\n';
}
}
int main()
{
Read();
for(int i = 1; i <= 4 * N; i++)
Arb[i] = -1;
precalcNext();
Solve();
return 0;
}