spoj的一样的题过了,但是uva的RE了
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int maxn = 1e5 + 5;
int n, m, B;
struct question {
int l, r, id;
bool operator < (question x) const {
if (l / B != x.l / B) return l < x.l;
return (l / B) & 1? r < x.r : r > x.r;
}
} q[maxn];
int a[maxn], ans[maxn], tans;
int cnt[maxn], tem[maxn];
void add(int x) {
cnt[x]++;
tem[cnt[x]]++;
tem[cnt[x] - 1]--;
tans = max(tans, cnt[x]);
}
void del(int x) {
cnt[x]--;
tem[cnt[x]]++;
tem[cnt[x] + 1]--;
if (tem[tans] == 0) tans--;
}
void init() {
B = 1.0 * n / sqrt(m);
tans = 0;
memset(cnt, 0, sizeof(cnt));
memset(tem, 0, sizeof(tem));
}
int main() {
while (true) {
scanf("%d", &n);
if (n == 0) return 0;
scanf("%d", &m);
init();
int k = 99999999, tot = 0;
for (int i = 1; i <= n; i++) {
int s; scanf("%d", &s);
if (s == k) a[i] = tot;
else a[i] = ++tot;
k = s;
}
for (int i = 1; i <= m; i++) {
scanf("%d %d", &q[i].l, &q[i].r);
q[i].id = i;
}
sort(q + 1, q + 1 + m);
int l = 1, r = 0;
for (int i = 1; i <= m; i++) {
while (r < q[i].r) add(a[++r]);
while (r > q[i].r) del(a[r--]);
while (l < q[i].l) del(a[l++]);
while (l > q[i].l) add(a[--l]);
ans[q[i].id] = tans;
}
for (int i = 1; i <= m; i++) {
printf("%d\n", ans[i]);
}
}
return 0;
}