#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream cin("pq.in");
ofstream cout("pq.out");
const int NMAX = 100007;
struct pq {
int x;
int y;
int Ind;
int Type;
};
vector < pq > events;
int Arbi[NMAX * 4];
int n, m, Ap[NMAX];
int ans[NMAX];
int Ans;
pq make_pq(int a, int b, int c, int d) {
pq e;
e.x = a;
e.y = b;
e.Ind = c;
e.Type = d;
return e;
}
bool Cmp(pq a, pq b) {
if(a.y != b.y)
return a.y < b.y;
return a.Type < b.Type;
}
void update(int Node, int st, int dr, int poz, int val){
if(st == dr){
Arbi[Node] = val;
return;
}
int med = (st + dr) >> 1;
if(med >= poz)
update(Node * 2, st, med, poz, val);
else
update(Node * 2 + 1, med + 1, dr, poz, val);
Arbi[Node] = max(Arbi[Node * 2], Arbi[Node * 2 + 1]);
}
void query(int Node, int st, int dr, int x, int y){
if(st >= x && y >= dr){
Ans = max(Ans, Arbi[Node]);
return ;
}
int med = (st + dr) >> 1;
if(med >= x)
query(Node * 2, st, med, x, y);
if(med < y)
query(Node * 2 + 1, med + 1, dr, x, y);
}
int main() {
cin >> n >> m;
for(int i = 1; i <= n; ++i) {
int a;
cin >> a;
events.push_back(make_pq(Ap[a], i, i, 0));
Ap[a] = i;
}
for(int i = 1; i <= m; ++i) {
int a, b;
cin >> a >> b;
events.push_back(make_pq(a, b, i, 1));
}
sort(events.begin(), events.end(), Cmp);
for(int i = 0; i < events.size(); ++i) {
if(events[i].Type == 0) {
if(events[i].x != 0) {
update(1, 1, n, events[i].x, events[i].y - events[i].x);
}
}
else {
Ans = -1;
query(1, 1, n, events[i].x, events[i].y);
if(Ans == 0) {
Ans = -1;
}
ans[events[i].Ind] = Ans;
}
}
for(int i = 1; i <= m; ++i) {
cout << ans[i] << "\n";
}
return 0;
}