#include <bits/stdc++.h>
using namespace std;
ifstream in("pq.in");
ofstream out("pq.out");
const int N_MAX = 1e5, Q_MAX = 1e5, A_MAX = 99999;
struct Query
{
int st, dr, ind;
bool operator <(const Query& other) const
{
if(dr == other.dr)
return st < other.st;
return dr < other.dr;
}
};
int n, m;
int a[N_MAX + 2];
Query q[Q_MAX + 2];
int ans[Q_MAX + 2], last[A_MAX + 2];
int aint[4 * N_MAX + 2];
void update(int node, int st, int dr, int pos, int val)
{
if(st == dr)
{
aint[node] = val;
return;
}
int med = (st + dr) / 2;
if(pos <= med)
update(2 * node, st, med, pos, val);
else
update(2 * node + 1, med + 1, dr, pos, val);
aint[node] = max(aint[2 * node], aint[2 * node + 1]);
}
int query(int node, int st, int dr, int querySt, int queryDr)
{
if(querySt <= st && dr <= queryDr)
return aint[node];
int med = (st + dr) / 2, maxSt = 0, maxDr = 0;
if(querySt <= med)
maxSt = query(2 * node, st, med, querySt, queryDr);
if(med < queryDr)
maxDr = query(2 * node + 1, med + 1, dr, querySt, queryDr);
return max(maxSt, maxDr);
}
int main()
{
in >> n >> m;
for(int i = 1; i <= n; i++)
in >> a[i];
for(int i = 1; i <= m; i++)
{
in >> q[i].st >> q[i].dr;
q[i].ind = i;
}
sort(q + 1, q + m + 1);
int j = 1;
for(int i = 1; i <= n; i++)
{
if(last[a[i]])
update(1, 1, n, last[a[i]], i - last[a[i]]);
last[a[i]] = i;
while(q[j].dr == i)
{
int val = query(1, 1, n, q[j].st, q[j].dr);
if(val == 0)
val = -1;
ans[q[j].ind] = val;
j++;
}
}
for(int i = 1; i <= m; i++)
out << ans[i] << '\n';
return 0;
}