#include <stdio.h>
#include <vector>
#define pii pair<int, int>
#define x first
#define y second
#define MAX 100005
using namespace std;
int n, m, a, b, v[MAX], pos[MAX], res[MAX], arb[2 * MAX], t = 1, cur = 1;
vector<pii> q[MAX];
int query(int node, int s, int d, int l, int r){
if(l <= s && d <= r)
return arb[node];
if(r < s || d < l)
return 0;
return max(query(2 * node, s, (s + d) / 2, l, r), query(2 * node + 1, (s + d) / 2 + 1, d, l, r));
}
void update(int a, int b){
a += t - 1;
arb[a] = b;
a >>= 1;
while(a){
arb[a] = max(arb[2 * a], arb[2 * a + 1]);
a >>= 1;
}
}
int main(){
freopen("pq.in", "r", stdin);
freopen("pq.out", "w", stdout);
scanf("%d%d", &n, &m);
while(t < n)
t <<= 1;
for(int i = 1; i <= n; ++i)
scanf("%d", &v[i]);
for(int i = 0; i < m; ++i){
scanf("%d%d", &a, &b);
q[b].push_back(make_pair(a, i));
}
for(int i = 1; i <= n; ++i){
if(pos[v[i]])
update(pos[v[i]], i - pos[v[i]]);
pos[v[i]] = i;
for(int j = 0; j < q[i].size(); ++j)
res[q[i][j].y] = query(1, 1, n, q[i][j].x, i);
}
for(int i = 0; i < m; ++i)
printf("%d\n", res[i] == 0 ? -1 : res[i]);
return 0;
}