#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <cstring>
#include <queue>
#include <unordered_map>
using namespace std;
ifstream fin("pq.in");
ofstream fout("pq.out");
const int N = 100005;
int n, q, x, y, last[N], pos[N], ans, Sol[N];
vector<pair<int, int> > G[N];
class SegmentTree
{
private:
int Tree[N * 4 + 5];
public:
void UpdateTree(int node, int st, int dr, int pos, int val)
{
if (st == dr)
{
Tree[node] = val;
return;
}
int mij = (st + dr) >> 1;
if (pos <= mij)
UpdateTree(node << 1, st, mij, pos, val);
else
UpdateTree((node << 1) | 1, mij + 1, dr, pos, val);
Tree[node] = max(Tree[node << 1], Tree[(node << 1) | 1]);
}
void QueryTree(int node, int st, int dr, int a, int b)
{
if (st >= a && dr <= b)
{
ans = max(ans, Tree[node]);
return;
}
int mij = (st + dr) >> 1;
if (a <= mij)
QueryTree(node << 1, st, mij, a, b);
if (b > mij)
QueryTree((node << 1) | 1, mij + 1, dr, a, b);
}
} SegTree;
void Read()
{
fin >> n >> q;
for (int i = 1; i <= n; i++)
{
fin >> x;
pos[i] = last[x];
last[x] = i;
}
for (int i = 1; i <= q; i++)
{
fin >> x >> y;
G[y].push_back(make_pair(x, i));
}
}
void Solve()
{
for (int i = 1; i <= n; i++)
{
if (pos[i])
SegTree.UpdateTree(1, 1, n, pos[i], i - pos[i]);
if (!G[i].empty())
{
vector<pair<int, int> >::iterator it;
for (it = G[i].begin(); it != G[i].end(); it++)
{
ans = 0;
SegTree.QueryTree(1, 1, n, (*it).first, i);
if (!ans)
ans--;
Sol[(*it).second] = ans;
}
}
}
}
void Print()
{
for (int i = 1; i <= q; i++)
fout << Sol[i] << '\n';
}
int main()
{
Read();
Solve();
Print();
}