求条,玄关:TLE80pts
查看原帖
求条,玄关:TLE80pts
631678
crazy__sheep楼主2025/2/7 10:47
#include<bits/stdc++.h>
//#define int long long
using namespace std;
inline int read()
{
   int x=0,f=1;char ch=getchar();
   while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
   while (ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
   return x*f;
}
void write(int x)
{
   if(x<0)putchar('-'),x=-x;
   if(x<10)putchar(x+'0');
   else write(x/10),putchar(x%10+'0');
}
const int N=2e5+5;
//const int mod=1e9+7;
int n,m,a[N],pos[N],t[N],len,cnt,id[N],ans[N];
bool v[N];
struct que
{
	int l,r,id,opk;
}q[N];
struct kuai
{
	int l,r;
}k[N];
bool cmp(que x,que y)
{
	if(id[x.l]==id[y.l])return x.r<y.r;
	return id[x.l]<id[y.l];
}
void  add(int x)
{
	t[a[x]]++;
	if(t[a[x]]==1)pos[id[a[x]]]++;
}
void del(int x)
{
	t[a[x]]--;
	if(t[a[x]]==0)pos[id[a[x]]]--;
}
int query()
{
	int op=1;
	for(int i=1;i<=cnt;i++)if(pos[i]!=k[i].r-k[i].l+1){op=i;break;}
	for(int i=k[op].l;i<=k[op].r;i++)if(!t[i])return i;
}
signed main()
{
	n=read();
	m=read();
	len=sqrt(n);
	id[0]=1;
	for(int i=1;i<=n;i++)
	{
		a[i]=min(read(),n+1);
		id[i]=(i-1)/len+1;
		if(id[i]!=id[i-1])
		{
			k[cnt].r=i-1;
			cnt++;
			k[cnt].l=i;
		}
	}
	k[1].l=0;
	id[n+1]=cnt;
	k[cnt].r=n+1;
	for(int i=1;i<=m;i++)
	{
		q[i].l=read();q[i].r=read();
		q[i].id=i;
		q[i].opk=id[i];
	}
	sort(q+1,q+m+1,cmp);
	int l=q[1].l,r=q[1].l-1;
//	for(int i=1;i<=m;i++)cout<<q[i].l<<" "<<q[i].r<<" "<<q[i].opk<<'\n';
	for(int i=1;i<=m;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--);
//		for(int i=0;i<=3;i++)cout<<pos[i]<<' ';
//		cout<<'\n';
		ans[q[i].id]=query();
	}
	for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
    return 0;
}
2025/2/7 10:47
加载中...