#include <bits/stdc++.h>
using namespace std;
const int limit = 2e5 + 10;
int n, m;
struct node{
int l, r, qid;
}query[limit];
int cnt[limit],a[limit],sum[limit];
int res;
void add(int x){
--sum[cnt[a[x]]];//减去多余部分
++cnt[a[x]];//增加一个count
res = max(res, cnt[a[x]]);
++sum[cnt[a[x]]];
}
void del(int x){
if(res == cnt[a[x]] && sum[cnt[a[x]]] == 1) --res;//如果没有了那就增加
--sum[cnt[a[x]]];//撤回一个count
--cnt[a[x]];
++sum[cnt[a[x]]];
}
map<int, int> mp;
int pos[limit];
int tot, vis[limit];
int main(){
// freopen("a.in","r",stdin);
// freopen("a.txt","w",stdout);
scanf("%d%d",&n,&m);
tot = 0;
for(int i = 1 ; i <= n ; i++ ){
int input;
scanf("%d",&input);
if(mp.count(input)){
a[i] = mp[input];
}else{
mp[input] = ++tot;
a[i] = mp[input];
}
}
int block = sqrt(n);//分块
for(int i = 1 ; i <= n ; i++ )
pos[i] = i / block + 1;
for(int i = 1 ; i <= m ; i++ ){
scanf("%d%d",&query[i].l,&query[i].r);
query[i].qid = i;
}
sort(query + 1, query + 1 + m,[](node a,node b){
if(pos[a.l] ^ pos[b.l]) return pos[a.l] < pos[b.l];
return (pos[a.l] & 1) ? a.r < b.r : a.r > b.r;
});
int L = 1 , R = 0;
for(int i = 1 ; i <= m ; i++ ){
while(L > query[i].l) add(--L);
while(L < query[i].l) del(L++);//缩进
while(R > query[i].r) del(R--);
while(R < query[i].r) add(++R);
vis[query[i].qid] = res;
}
for(int i = 1 ; i <= m ; i++ ){
printf("%d\n", -vis[i]);
}
return 0;
}
上面的wa了,下面的AC
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const int maxn = 2e5 + 10;
struct node{
int l,r,id;
};
node Q[maxn];
int arr[maxn],pos[maxn];
int cnt[maxn],t[maxn],v[maxn];
int ans[maxn];
int n,m,c;
void add(int x);
void del(int x);
int main(){
// freopen("a.in","r",stdin);
// freopen("name.txt","w",stdout);
scanf("%d%d",&n,&m);
int ns = sqrt(n);
for(int i = 1 ; i <= n ; i++ ){
scanf("%d",&arr[i]);
v[i] = arr[i];
pos[i] = i / ns + 1;
}
sort(v + 1,v + 1 + n);
int cntv = unique(v + 1,v + 1 + n) - v - 1;
for(int i = 1 ; i <= n ; i++ )
arr[i] = lower_bound(v + 1,v + 1 + cntv,arr[i]) - v;
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,[](node a,node b){
if(pos[a.l] ^ pos[b.l]) return pos[a.l] < pos[b.l];
return a.r < b.r;
});
int L = 1,R = 0;
for(int i = 1 ; i <= m ; i++ ){
while(Q[i].l < L) add(--L);
while(Q[i].l > L) del(L++);
while(Q[i].r < R) del(R--);
while(Q[i].r > R) add(++R);
ans[Q[i].id] = c;
}
for(int i = 1 ; i <= m ; i++ ){
printf("%d\n", -ans[i]);
}
return 0;
}
void add(int x){
--t[cnt[arr[x]]];
++cnt[arr[x]];
c = max(c,cnt[arr[x]]);
++t[cnt[arr[x]]];
}
void del(int x){
if(t[cnt[arr[x]]] == 1 && c == cnt[arr[x]]){
--c;
}
--t[cnt[arr[x]]];
--cnt[arr[x]];
++t[cnt[arr[x]]];
}