RE on #9
查看原帖
RE on #9
520056
luoyx楼主2023/5/16 20:14
#include <bits/stdc++.h>
using namespace std;

const int N=6e5+5;

int n,m,siz;
int x[N],num[N],ind,ans[N];
int l,r;
struct query{
	int id,l,r;
}q[N];

bool cmp(query a,query b){
	if(a.l/siz!=b.l/siz) return a.r<b.r;
	return a.l<b.l;
}

int res,cnt[N],t[N];

void add(int w){
	cnt[w]++;
	if(cnt[w]>res){
		res=cnt[w];
	}
	t[cnt[w]-1]--;
	t[cnt[w]]++;
}

void del(int w){
	if(cnt[w]==res){
		if(t[res]==1){
			res--;
		}
	}
	t[cnt[w]]--;
	t[cnt[w]-1]++;
	cnt[w]--;
}

int main(){
	cin>>n>>m;
	siz=sqrt(n)+1;
	for(int i=1;i<=n;i++){
		scanf("%d",&x[i]);
		num[++ind]=x[i];
	}
	sort(num+1,num+ind+1);
	ind=unique(num+1,num+ind+1)-num-1;
	for(int i=1;i<=n;i++){
		x[i]=lower_bound(num+1,num+ind+1,x[i])-num;
	}
	
	for(int i=1;i<=m;i++){
		scanf("%d%d",&l,&r);
		q[i]={i,l,r};
	}
	sort(q+1,q+m+1,cmp);
	
	int L=1,R=0;
	for(int i=1;i<=m;i++){
		while(L>q[i].l) add(x[--L]);
		while(L<q[i].l) del(x[L++]);
		while(R>q[i].r) del(x[R--]);
		while(R<q[i].r) add(x[++R]);
		ans[q[i].id]=res;
	}
	
	for(int i=1;i<=m;i++){
		printf("%d\n",ans[i]);
	}
}
2023/5/16 20:14
加载中...