#include <cstdio>
#include<algorithm>
#define MAX 100000
#define LOG 20
using namespace std;
struct aa{
int x, y, ind, rasp;
}q[MAX+1], intr[MAX+1];
int v[MAX+1], n, m, fr[MAX+1], k, arb[(1<<LOG)+1];
inline int maxim(int a, int b)
{
if(a>b)
return a;
return b;
}
bool cresc1(const aa &a, const aa &b)
{
if(a.x<b.x)
return true;
if(a.x>b.x)
return false;
return (a.y<b.y);
}
bool cresc2(const aa &a, const aa &b)
{
return (a.ind<b.ind);
}
void update(int poz, int val, int st, int dr, int nod)
{
int mij=(st+dr)/2;
if(st==dr){
arb[nod]=val;
return;
}
if(poz<=mij)
update(poz, val, st, mij, nod*2);
else update(poz, val, mij+1, dr, nod*2+1);
arb[nod]=maxim(arb[nod*2], arb[nod*2+1]);
}
int query(int x, int y, int st, int dr, int nod)
{
int mij=(st+dr)/2, m1=0, m2=0;
if(st>=x && dr<=y)
return arb[nod];
if(x<=mij)
m1=query(x, y, st, mij, nod*2);
if(y>mij)
m2=query(x, y, mij+1, dr, nod*2+1);
return maxim(m1, m2);
}
int main()
{
freopen("pq.in", "r",stdin);
freopen("pq.out", "w", stdout);
int st, dr;
scanf("%d%d", &n, &m);
for(int i=1;i<=n;++i){
scanf("%d", &v[i]);
if(fr[v[i]]!=0)
{
intr[++k].x=fr[v[i]];
intr[k].y=i;
}
fr[v[i]]=i;
}
for(int i=1;i<=m;++i){
scanf("%d%d", &q[i].x, &q[i].y);
q[i].ind=i;
}
sort(q+1,q+m+1, cresc1);
sort(intr+1, intr+k+1, cresc1);
st=dr=1;
for(int i=1;i<=m;++i)
{
while(intr[st].x<q[i].x){
update(intr[st].y, 0, 1, n, 1);
st++;
}
if(st>dr)
dr=st;
while(intr[dr].x>=q[i].x && intr[dr].y<=q[i].y)
{
update(intr[dr].y, intr[dr].y-intr[dr].x, 1, n, 1);
dr++;
}
q[i].rasp=query(q[i].x, q[i].y, 1, n, 1);
}
sort(q+1, q+m+1, cresc2);
for(int i=1;i<=m;++i){
if(!q[i].rasp)
printf("-1\n");
else printf("%d\n", q[i].rasp);
}
return 0;
}