#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 5;
int n, m;
int a[N];
int b[N];
int vis[N], cnt[N];
int res;
int ans[N];
struct node
{
int l, r;
int soc;
} q[N];
int len;
int belong(int x)
{
return (x - 1) / len + 1;
}
bool compare(struct node x, struct node y)
{
return (belong(x.l) ^ belong(y.l)) ? belong(x.l) < belong(y.l) : ((belong(x.l) & 1) ? x.r < y.r : x.r > y.r);
}
void Add(int x)
{
cnt[vis[x]]--;
cnt[++vis[x]]++;
res = max(res, vis[x]);
return;
}
void Del(int x)
{
if (vis[x] == res && cnt[vis[x]] == 1)
res--;
cnt[vis[x]]--;
cnt[--vis[x]]++;
return;
}
int main(void)
{
scanf("%d%d", &n, &m);
len = sqrt(n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
b[i] = a[i];
}
sort(b + 1, b + n + 1);
int Len = unique(b + 1, b + n + 1) - b - 1;
for (int i = 1; i <= n; i++)
{
a[i] = lower_bound(b + 1, b + Len + 1, a[i]) - b;
}
for (int i = 1; i <= m; i++)
{
scanf("%d%d", &q[i].l, &q[i].r);
q[i].soc = i;
}
sort(q + 1, q + m + 1, compare);
int L = 1, R = 0;
for (int i = 1; i <= m; i++)
{
while (q[i].l > L)
Del(a[L++]);
while (q[i].r < R)
Del(a[R--]);
while (q[i].l < L)
Add(a[--L]);
while (q[i].r > R)
Add(a[++R]);
ans[q[i].soc] = res;
}
for (int i = 1; i <= m; i++)
{
printf("%d\n", -1 * ans[i]);
}
return 0;
}
而且我本机好像是对的?