#include <algorithm>
#include <fstream>
#include <set>
#define NMAX 100005
#define se second
#define fi first
using namespace std;
ifstream f("pq.in");
ofstream g("pq.out");
int lst[NMAX] , nxt[NMAX] , arb[5 * NMAX] , ans[NMAX];
int n , q , x;
pair <int , pair <int , int> > v[NMAX];
void update(int inc , int sf , int val , int pos , int nr);
int query(int inc , int sf , int a , int b , int nr);
int main() {
f >> n >> q;
for (int i = 1; i <= n; ++i) {
f >> x;
if(lst[x] != 0) {
nxt[lst[x]] = i;
update(1 , n , i - lst[x] , i , 1);
}
lst[x] = i;
}
for (int i = 1; i <= q; ++i) {
f >> v[i].fi >> v[i].se.fi;
v[i].se.se = i;
}
sort(v + 1 , v + q + 1);
int pos = 1;
for (int i = 1; i <= q; ++i) {
while(pos < v[i].fi) {
if(nxt[pos] != 0)
update(1 , n , 0 , nxt[pos] , 1);
++pos;
}
int aux = query(1 , n , v[i].fi , v[i].se.fi , 1);
if(!aux) {
ans[v[i].se.se] = -1;
}
else {
ans[v[i].se.se] = aux;
}
}
for (int i = 1; i <= q; ++i) {
g << ans[i] << '\n';
}
return 0;
}
void update(int inc , int sf , int val , int pos , int nr) {
int mij = (inc + sf) / 2;
if (inc == sf && inc == pos) {
arb[nr] = val;
return ;
}
if (pos <= mij) {
update(inc , mij , val , pos , 2 * nr);
}
else {
update(mij + 1, sf , val , pos , 2 * nr + 1);
}
arb[nr] = max(arb[2 * nr] , arb[2 * nr + 1]);
}
int query(int inc , int sf , int a , int b , int nr) {
int mij = (inc + sf) / 2;
if (a <= inc && b >= sf){
return arb[nr];
}
if (b <= mij){
return query(inc , mij , a , b , 2 * nr);
}
if (a > mij){
return query(mij + 1 , sf , a , b , 2 * nr + 1);
}
if (a <= mij && mij <= b)
return max(query(inc , mij , a , b , 2 * nr) , query(mij + 1 , sf , a , b , 2 * nr + 1));
}