#include <bits/stdc++.h>
using namespace std;
using uint = unsigned int;
using ll = long long;
using pii = pair<int, int>;
#define dbg(x) cerr<<#x": "<<x<<'\n'
#define dbg_v(x, n) cerr<<#x"[]: ";for(long long _=0;_<n;++_)cerr<<(x)[_]<<' ';cerr<<'\n'
#define all(v) v.begin(), v.end()
#define NMAX 100010
#define VMAX 100010
struct node
{
int val;
node *l, *r;
node(int _val) { val = _val; l = r = nullptr; }
node(node *n) { val = n->val; l = n->l; r = n->r; }
};
using Node = node*;
int v[NMAX], last[VMAX];
Node rev[NMAX];
Node emptyST(int l, int r)
{
if(l == r) return new node(-1);
int mid = (l + r) / 2;
Node newNode = new node(-1);
newNode->l = emptyST(l, mid);
newNode->r = emptyST(mid + 1, r);
return newNode;
}
Node update(Node n, int l, int r, int pos, int val)
{
if(l == r) return new node(val);
int mid = (l + r) / 2;
Node newNode = new node(n);
if(pos <= mid) newNode->l = update(n->l, l, mid, pos, val);
else newNode->r = update(n->r, mid + 1, r, pos, val);
newNode->val = max(newNode->l->val, newNode->r->val);
return newNode;
}
int query(Node n, int l, int r, int a, int b)
{
if(a <= l && r <= b) return n->val;
int mid = (l + r) / 2, v1 = -1, v2 = -1;
if(a <= mid) v1 = query(n->l, l, mid, a, b);
if(mid + 1 <= b) v2 = query(n->r, mid + 1, r, a, b);
return max(v1, v2);
}
int main()
{
ifstream cin("pq.in");
ofstream cout("pq.out");
ios_base::sync_with_stdio(false);
int i, n, q, l, r;
cin >> n >> q;
rev[0] = emptyST(1, n);
for(i = 1; i <= n; ++i)
{
cin >> v[i];
if(last[v[i]])
{
rev[i] = update(rev[i - 1], 1, n, last[v[i]], i - last[v[i]]);
}
else rev[i] = rev[i - 1];
last[v[i]] = i;
}
for(i = 1; i <= q; ++i)
{
cin >> l >> r;
cout << query(rev[r], 1, n, l, r) << '\n';
}
return 0;
}