#include <bits/stdc++.h>
#define Nmax 100005
using namespace std;
ifstream f("pq.in");
ofstream g("pq.out");
int N, Q;
int aib[Nmax], last[Nmax], v[Nmax], tree[4 * Nmax];
void update(int node, int le, int ri, int pos, int val) {
if (le == ri) tree[node] = val;
else {
int mid = (le + ri) / 2;
if (pos <= mid) update(2 * node, le, mid, pos, val);
else update(2 * node + 1, mid + 1, ri, pos, val);
tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}
}
int res;
void query(int node, int le, int ri, int a, int b) {
if (le >= a && ri <= b) res = max(res, tree[node]);
else {
int mid = (le + ri) / 2;
if (a <= mid) query(2 * node, le, mid, a, b);
if (mid < b) query(2 * node + 1, mid + 1, ri, a, b);
}
}
struct Query{
int le, ri, pos, ans;
};
Query q[Nmax];
bool cmp1(Query a, Query b) {
return a.ri < b.ri;
}
bool cmp2(Query a, Query b) {
return a.pos < b.pos;
}
int main()
{
f >> N >> Q;
for (int i = 1; i <= N; ++i)
f >> v[i];
for (int i = 1; i <= Q; ++i)
f >> q[i].le >> q[i].ri, q[i].pos = i;
sort(q + 1, q + Q + 1, cmp1);
for (int i = 1; i <= 4 * N; ++i)
tree[i] = -1;
int j = 1;
for (int i = 1; i <= N; ++i) {
if (last[v[i]]) update(1, 1, N, last[v[i]], i - last[v[i]]);
last[v[i]] = i;
while (j <= Q && q[j].ri == i) {
res = -1;
query(1, 1, N, q[j].le, q[j].ri);
q[j].ans = res;
++j;
}
}
sort(q + 1, q + Q + 1, cmp2);
for (int i = 1; i <= Q; ++i)
g << q[i].ans << '\n';
return 0;
}