#include <stdio.h>
#include <algorithm>
#include <vector>
#define maxdim 100005
using namespace std;
int n, q;
int a[maxdim], urm[maxdim];
vector<pair<int, pair<int, int>>> queries;
vector<pair<int, int>> events;
int sol[maxdim], arb[4 * maxdim];
void update(int nod, int st, int dr, int poz, int val) {
if (st == dr) {
arb[nod] = val;
return;
}
int mij = (st + dr) >> 1;
int nodst = nod << 1;
int noddr = nodst | 1;
if (poz <= mij) {
update(nodst, st, mij, poz, val);
} else {
update(noddr, mij + 1, dr, poz, val);
}
arb[nod] = max(arb[nodst], arb[noddr]);
}
void query(int nod, int st, int dr, int a, int b, int &sol) {
if (a <= st && dr <= b) {
if (arb[nod]) {
sol = max(sol, arb[nod]);
}
return;
}
int mij = (st + dr) >> 1;
int nodst = nod << 1;
int noddr = nodst | 1;
if (a <= mij) {
query(nodst, st, mij, a, b, sol);
}
if (b > mij) {
query(noddr, mij + 1, dr, a, b, sol);
}
}
int main() {
freopen("pq.in", "r", stdin);
freopen("pq.out", "w", stdout);
scanf("%d %d", &n, &q);
for (int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
}
for (int i = 1; i <= q; ++i) {
int x, y; scanf("%d %d", &x, &y);
queries.push_back(make_pair(y, make_pair(x, i)));
}
for (int i = n; i >= 1; --i) {
if (urm[a[i]]) {
events.push_back(make_pair(urm[a[i]], i));
}
urm[a[i]] = i;
}
sort(queries.begin(), queries.end());
sort(events.begin(), events.end());
int p = 0;
for (auto &q : queries) {
while (p < events.size() && events[p].first <= q.first) {
update(1, 1, n, events[p].second, events[p].first - events[p].second);
++p;
}
sol[q.second.second] = -1;
query(1, 1, n, q.second.first, q.first, sol[q.second.second]);
}
for (int i = 1; i <= q; ++i) {
printf("%d\n", sol[i]);
}
}