#include <fstream>
#include <algorithm>
using namespace std;
ifstream cin ("pq.in");
ofstream cout ("pq.out");
struct Query {
int l, r, ind;
bool operator < (const Query &other) const {
return r < other.r;
}
};
int n, m;
int v[100005], ans[100005], lst[100005];
Query q[100005];
int aint[400005];
void update(int nod, int st, int dr, int ind, int val) {
if(st > dr || ind < st || dr < ind)
return;
if(st == dr) {
aint[nod] = val;
return;
}
int mid = (st + dr) >> 1;
update((nod << 1), st, mid, ind, val);
update((nod << 1) | 1, mid + 1, dr, ind, val);
aint[nod] = max(aint[(nod << 1)], aint[(nod << 1) | 1]);
}
int query(int nod, int st, int dr, int l, int r) {
if(st > dr || r < st || dr < l)
return 0;
if(l <= st && dr <= r)
return aint[nod];
int mid = (st + dr) >> 1;
return max(query((nod << 1), st, mid, l, r), query((nod << 1) | 1, mid + 1, dr, l, r));
}
int main() {
cin >> n >> m;
for(int i = 1; i <= n; i++)
cin >> v[i];
for(int i = 1; i <= m; i++)
cin >> q[i].l >> q[i].r, q[i].ind = i;
sort(q + 1, q + m + 1);
int j = 1;
for(int i = 1; i <= n; i++) {
if(lst[v[i]])
update(1, 1, n, lst[v[i]], i - lst[v[i]]);
lst[v[i]] = i;
while(j <= m && q[j].r == i) {
ans[q[j].ind] = query(1, 1, n, q[j].l, q[j].r);
j++;
}
}
for(int i = 1; i <= m; i++)
cout << (ans[i] == 0 ? -1 : ans[i]) << "\n";
return 0;
}