#include <bits/stdc++.h>
typedef long long ll;
typedef double lf;
using namespace std;
const int INF = 1e9+7;
const int maxn = 2e5+5;
const int maxb = 5e2+5;
const int maxq = 2e5+5;
int n, Q;
int len;
ll a[maxn];
int id[maxn];
ll ans[maxn];
unordered_map<ll, ll> cnt;
ll res, saveres;
template <typename type>
void inline read(type &x){
x = 0; type f = 1;
char ch = getchar();
while (ch < '0' || ch > '9'){
if (ch == '-')
f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9')
x = x*10+ch-'0', ch = getchar();
x = x*f;
}
struct node{
int id;
int l, r;
}q[maxq];
struct node2{
int l, r;
}blocks[maxb];
void build_blocks(){
for (int i = 1; i <= n; i++){
id[i] = (i-1)/len + 1;
if (id[i-1] != id[i])
blocks[id[i]].l = i;
blocks[id[i]].r = i;
}
}
unordered_map<ll, ll> cntt;
ll solve(int l, int r){
cntt.clear();
for (int i = l; i <= r; i++){
cntt[a[i]]++;
}
ll res = -1;
for (int i = l; i <= r; i++){
res = max(res, cntt[a[i]]);
}
return res;
}
void add(int i){
cnt[a[i]]++;
res = max(res, cnt[a[i]]);
}
bool cmp(const node &a, const node &b){
if (id[a.l] != id[b.l])
return id[a.l] < id[b.l];
return a.r < b.r;
}
int main(){
read(n); read(Q);
len = ceil(sqrt(n));
for (int i = 1; i <= n; i++){
read(a[i]);
}
for (int i = 1; i <= Q; i++){
q[i].id = i;
read(q[i].l); read(q[i].r);
}
build_blocks();
sort(q+1, q+Q+1, cmp);
int l = 0, r = 0;
for (int i = 1; i <= Q; i++){
int ql = q[i].l;
int qr = q[i].r;
int qid = q[i].id;
if (id[ql] == id[qr]){
ans[qid] = solve(ql, qr);
continue;
}
if (id[l] != id[ql]){
l = blocks[id[ql]].r;
r = blocks[id[ql]].r;
cnt.clear();
res = -1;
add(l);
}
while (r < qr)
add(++r);
saveres = res;
while (ql < l)
add(--l);
ans[qid] = res;
for (int i = l; i < blocks[id[ql]].r; i++){
cnt[a[i]]--;
}
l = blocks[id[ql]].r;
res = saveres;
}
for (int i = 1; i <= Q; i++){
printf("-%lld\n", ans[i]);
}
return 0;
}