#include <fstream>
#include <vector>
#define x first
#define y second
using namespace std;
class InputReader {
public:
InputReader() {}
InputReader(const char *file_name) {
input_file = fopen(file_name, "r");
cursor = 0;
fread(buffer, SIZE, 1, input_file);
}
inline InputReader &operator >>(int &n) {
while(buffer[cursor] < '0' || buffer[cursor] > '9') {
advance();
}
n = 0;
while('0' <= buffer[cursor] && buffer[cursor] <= '9') {
n = n * 10 + buffer[cursor] - '0';
advance();
}
return *this;
}
private:
FILE *input_file;
static const int SIZE = 1 << 17;
int cursor;
char buffer[SIZE];
inline void advance() {
++ cursor;
if(cursor == SIZE) {
cursor = 0;
fread(buffer, SIZE, 1, input_file);
}
}
}f("pq.in");
ofstream g("pq.out");
int n,t,i,j,maxim,val,poz,y,x,a,b,nr,v[1<<17],T[1<<17],sol[1<<17],AI[1<<19];
struct pt
{
int x;
int y;
};
vector <pt> V[1<<17];
inline void build(int nod,int left,int right)
{
if(left==right) AI[nod]=sol[left];
else
{
int mid=(left+right)>>1;
build(nod<<1,left,mid);
build((nod<<1)+1,mid+1,right);
AI[nod]=max(AI[nod<<1],AI[(nod<<1)+1]);
}
}
inline void update (int nod, int left ,int right)
{
if(left==right)
{
AI[nod]=val;
return;
}
int mij=(left+right)>>1;
if(poz<=mij) update(nod<<1,left,mij);
else update((nod<<1)+1,mij+1,right);
AI[nod]=max(AI[nod<<1],AI[(nod<<1)+1]);
}
inline void query(int nod,int left,int right)
{
if(a<=left&&right<=b)
{
maxim=max(AI[nod],maxim);
return;
}
int mij=(left+right)>>1;
if(a<=mij) query(nod<<1,left,mij);
if(b>mij) query((nod<<1)+1,mij+1,right);
}
int main()
{
f>>n>>t;
for(i=1;i<=n;++i)
{
f>>x;
if(v[x])
{
sol[i]=i-v[x];
T[v[x]]=i;
}
v[x]=i;
}
build(1,1,n);
for(i=1;i<=t;++i)
{
f>>x>>y;
V[x].push_back({y,i});
}
for(i=1;i<=n;++i)
{
a=i;
for(j=0;j<V[i].size();++j)
{
maxim=0;
b=V[i][j].x;
query(1,1,n);
if(!maxim) maxim=-1;
sol[V[i][j].y]=maxim;
}
poz=T[i];
val=0;
update(1,1,n);
}
for(i=1;i<=t;++i) g<<sol[i]<<'\n';
return 0;
}