甚至输出-ans[i]后 P3709 过了
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define PII pair<int,int>
//#define int ll
const int N = 2e6 + 5;
int n, T, Cnt, Bs, cnt_max = -1;
int a[N], dct[N], b[N], ans[N], cnt[N], cnt_1[N];
struct node
{
int l, r, id;
bool operator< (const node &e)const
{
return b[l] < b[e.l] || (b[l] == b[e.l] && (b[l] & 1 ? r > e.r : r < e.r));
}
}q[N];
void init()
{
Bs = max(1, (int)sqrt(n));
for (int i = 1; i <= n; i ++)
b[i] = i / Bs;
}
void add(int x)
{
x = a[x];
-- cnt_1[cnt[x]],++ cnt_1[++ cnt[x]], cnt_max = max(cnt_max, cnt[x]);
//cout << cnt_max << '\n';
}
void del(int x)
{
x = a[x];
-- cnt_1[cnt[x]];
if (cnt_1[cnt[x]] == 0 && cnt[x] == cnt_max)
-- cnt_max;
-- cnt[x];
++ cnt_1[cnt[x]];
//cout << cnt_max << '\n';
}
void solve()
{
cin >> n >> T;
init();
for (int i = 1; i <= n; i ++)
cin >> a[i], dct[i] = a[i];
sort(dct + 1, dct + 1 + n);
Cnt = unique(dct + 1, dct + 1 + n) - dct - 1;
for (int i = 1; i <= n; i ++)
a[i] = lower_bound(dct + 1, dct + 1 + Cnt, a[i]) - dct - 1;
//for (int i = 1; i <= n; i ++) cout << a[i] << " ";
for (int i = 1; i <= n; i ++)
{
cin >> q[i].l >> q[i].r;
q[i].id = i;
}
sort(q + 1, q + 1 + T);
int L = 1, R = 0;
for (int i = 1; i <= T; i ++)
{
while (L > q[i].l)
add(-- L);
while (R < q[i].r)
add(++ R);
while (L < q[i].l)
del(L ++);
while (R > q[i].r)
del(R --);
ans[q[i].id] = cnt_max;
}
for (int i = 1; i <= T; i ++)
cout << ans[i] << '\n';
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
solve();
}