求助90 最后一个点错了
查看原帖
求助90 最后一个点错了
261417
asasas楼主2022/10/25 17:29
#include <bits/stdc++.h>
using namespace std;
int K;
struct as{
	int l,r,id;
}ask[300005];
int n,m;
int num[300005],cnt[300005],ans[300005],KK;
bool cmp(as a,as b){
	int p1=(a.r-1)/KK+1,p2=(b.r-1)/KK+1;
	return p1^p2?p1<p2:(p1&1?a.l>b.l:a.l<b.l);
}
int a[200005];
void add(int x){
	if (cnt[a[x]]==0) num[a[x]/K]++;
	cnt[a[x]]++;
}
void del(int x){
	if (cnt[a[x]]==1) num[a[x]/K]--;
	cnt[a[x]]--;
}
int getsum(){
	for (register int i=0;i<K;i++){
		if (num[i]==K) continue ;
		for (register int j=i*K;j<(i+1)*K;j++){
			if (cnt[j]==0) return j;
		} 
	}
}
int main(){
//	freopen("P4137_1.in","r",stdin);
//	freopen("P4137.out","w",stdout);
	cin >> n >> m;
	int l=1,r=0;
	K=sqrt(n*1.0);
	KK=sqrt(m*1.0);
	for (register int i=1;i<=n;i++) cin >> a[i];
	for (register int i=1;i<=m;i++){
		cin >> ask[i].l >> ask[i].r;
		ask[i].id=i; 
	}
	sort(ask+1,ask+1+m,cmp);
	for (register int i=ask[1].l;i<=ask[1].r;i++) add(i);
	l=ask[1].l,r=ask[1].r;
	for (register int i=2;i<=m;i++){
		while(l<ask[i].l) del(l++);
		while(l>ask[i].l) add(--l);
		while(r<ask[i].r) add(++r);
		while(r>ask[i].r) del(r--);
		ans[ask[i].id]=getsum();
	}
	for (register int i=1;i<=m;i++) cout << ans[i] << '\n';
}
2022/10/25 17:29
加载中...