莫队TLE吸氧90求助
查看原帖
莫队TLE吸氧90求助
119062
Lates楼主2020/8/18 08:05
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
inline int read(){
	register int x=0,f=0,ch=getchar();
	while('0'>ch||ch>'9')f^=ch=='-',ch=getchar();
	while('0'<=ch&&ch<='9')x=(x<<1)+(x<<3)+(ch^'0'),ch=getchar();
	return f?-x:x;
}
const int MAX=2e5+5;
int n,m,L;
struct E{
	int l,r,id,bl;
	inline bool operator <(const E & x)const {return bl==x.bl?r<x.r:l<x.l;} 
}e[MAX];
int a[MAX],cl(1),cr;
int tot[MAX],res,ans[MAX];
inline void solve(int x,int v){
	if(a[x]<=MAX-5){
		tot[a[x]]+=v;
		if(tot[a[x]]==0)res=min(res,a[x]);
		if(tot[a[x]]&&res==a[x])while(true)if(!tot[++res])break;
	}
}
signed main(){
//	freopen("in.in","r",stdin);
	n=read(),m=read();L=(int)(sqrt(n));
	for(register int i=1;i<=n;++i)a[i]=read();
	for(register int i=1;i<=m;++i)e[i]=(E){read(),read(),i},e[i].bl=(e[i].l-1)/L+1;
	sort(e+1,e+1+m);
//	puts("QAQ");
	for(register int i=1;i<=m;++i){
		while(cl<e[i].l)solve(cl++,-1);
		while(cl>e[i].l)solve(--cl,1);
		while(cr<e[i].r)solve(++cr,1);
		while(cr>e[i].r)solve(cr--,-1);
		ans[e[i].id]=res;
	}
	for(register int i=1;i<=m;++i){
		printf("%d\n",ans[i]);
	}
	return 0;
}

2020/8/18 08:05
加载中...