#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 1;
ifstream fin("pq.in");
ofstream fout("pq.out");
#define cin fin
#define cout fout
int n, q, v[N];
long long ans[N];
vector<pair<int, int>> en[N];
vector<pair<int, int>> query(N);
vector<int> fr[N];
long long aint[N * 4], lazy[N * 4];
void update(int v, int tl, int tr, int l, int r, long long val){
if(lazy[v]){
aint[v] = max(lazy[v], aint[v]);
if(tl != tr){
lazy[v * 2] = max(lazy[v], lazy[v * 2]);
lazy[v * 2 + 1] = max(lazy[v * 2 + 1], lazy[v]);
}
lazy[v] = 0;
}
if(l <= tl && r >= tr){
aint[v] = max(aint[v], val);
if(tl != tr){
lazy[v * 2] = max(val, lazy[v * 2]);
lazy[v * 2 + 1] = max(lazy[v * 2 + 1],val);
}
return;
}
if(tr < l || tl > r) return;
int tm = (tl + tr) / 2;
update(v * 2, tl, tm, l, r, val);
update(v * 2 + 1, tm + 1, tr, l, r, val);
aint[v] = max({aint[v], aint[v * 2], aint[v * 2 + 1]});
}
int qu(int v, int tl, int tr, int l){
if(lazy[v]){
aint[v] = max(lazy[v], aint[v]);
if(tl != tr){
lazy[v * 2] = max(lazy[v], lazy[v * 2]);
lazy[v * 2 + 1] = max(lazy[v * 2 + 1], lazy[v]);
}
lazy[v] = 0;
}
if(tl == tr){
return aint[v];
}
else{
int tm = (tl + tr) / 2;
if(l <= tm){
return qu(v * 2, tl, tm, l);
}else return qu(v * 2 + 1, tm + 1, tr, l);
}
}
int main(){
cin.tie(0)->sync_with_stdio(0);
cin >> n >> q;
for(int i = 1; i <= n; i++){
cin >> v[i];
fr[v[i]].push_back(i);
}
for(int i = 1; i <= q; i++){
int a, b;
cin >> a >> b;
query[i] = {a, b};
en[b].push_back({a, i});
}
for(int i = 1; i <= n; i++){
auto it = lower_bound(fr[v[i]].begin(), fr[v[i]].end(), i);
int pos = it - fr[v[i]].begin();
if(pos != 0){
int cost = fr[v[i]][pos] - fr[v[i]][pos - 1];
update(1, 1, n, 1, fr[v[i]][pos - 1], cost);
}
for(auto j : en[i]){
int plt = qu(1, 1, n, j.first);
ans[j.second] = (plt == 0 ? -1 : plt);
}
}
for(int i = 1; i <= q; i++){
cout << ans[i] << '\n';
}
}