#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
#define leftson (2 * node)
#define rightson (2 * node + 1)
const int nmax = 100010;
int n, q, a[nmax], prv[nmax], l, r, ans[nmax], aint[4 * nmax];
vector<pair<int, int> > qr[nmax];
map<int, int> seen;
void update(int node, int left, int right, int pos, int val)
{
if (left == right)
{
aint[node] = val;
return ;
}
int mid = (left + right) / 2;
if (pos <= mid)
update(leftson, left, mid, pos, val);
else
update(rightson, mid + 1, right, pos, val);
aint[node] = max(aint[leftson], aint[rightson]);
}
int query(int node, int left, int right, int leftb, int rightb)
{
if (leftb <= left && right <= rightb)
return aint[node];
int mid = (left + right) / 2, now = 0;
if (leftb <= mid) now = max(now, query(leftson, left, mid, leftb, rightb));
if (mid < rightb) now = max(now, query(rightson, mid + 1, right, leftb, rightb));
return now;
}
int main()
{
freopen("pq.in", "r", stdin);
freopen("pq.out", "w", stdout);
scanf("%i %i", &n, &q);
for (int i = 1; i <= n; ++ i) scanf("%i", &a[i]);
for (int i = 1; i <= q; ++ i)
{
scanf("%i %i", &l, &r);
qr[r].push_back(make_pair(l, i));
}
for (int i = 1; i <= n; ++ i)
{
if (seen[a[i]])
prv[i] = seen[a[i]];
else
prv[i] = -1;
seen[a[i]] = i;
}
for (int i = 1; i <= n; ++ i)
update(1, 1, n, i, 0);
for (int i = 1; i <= n; ++ i)
{
if (prv[i] != -1)
update(1, 1, n, prv[i], i - prv[i]);
for (int j = 0; j < qr[i].size(); ++ j)
{
int left = qr[i][j].first, ind = qr[i][j].second, right = i;
ans[ind] = query(1, 1, n, left, right);
if (ans[ind] == 0)
ans[ind] = -1;
}
}
for (int i = 1; i <= q; ++ i)
printf("%i\n", ans[i]);
}