看不懂,为什么是MLe
查看原帖
看不懂,为什么是MLe
167279
Danno0v0楼主2022/10/8 19:41
#include<bits/stdc++.h>
using namespace std;
struct node
{
	int tot,l,r;
}tree[1<<24];
int cnt;
int root[1000001];
int n,a[1000001];
int clone(int x)
{
	tree[++cnt]=tree[x];
	return cnt;
}
void update(int x)
{
	tree[x].tot=tree[tree[x].l].tot+tree[tree[x].r].tot;
}
int change(int x,int k,int b,int L,int R)
{
	x=clone(x);
	if(L==R&&L==b)
	{
		tree[x].tot+=k;
		return x;
	}
	int m=(L+R)>>1;
	if(b<=m)
	{
		if(!tree[x].l) tree[x].l=++cnt;
		tree[x].l=change(tree[x].l,k,b,L,m);
	}
	else
	{
		if(!tree[x].r) tree[x].r=++cnt;
		tree[x].r=change(tree[x].r,k,b,m+1,R);
	}
	update(x);
	return x;
}
int query(int x,int l,int r,int L,int R)
{
	if(l>=L&&R<=r)
		return tree[x].tot;
	int m=(L+R)>>1,ans=0;
	if(l<=m)
	{
		if(!tree[x].l) tree[x].l=++cnt;
		ans+=query(tree[x].l,l,r,L,m);
	}
	if(m<r)
	{
		if(!tree[x].r) tree[x].r=++cnt;
		ans+=query(tree[x].r,l,r,m+1,R);
	}
	return ans; 
}
int main()
{
	int x,y;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		root[i]=change(root[i-1],a[i],a[i],1,1000000000);
	}
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>x>>y;
		int now=0;
		while(1)
		{
			int res=0;
			if(now>=1)
				res=query(root[y],1,now,1,1000000000)-query(root[x-1],1,now,1,1000000000);
			if(res>=now)
				now=res+1;
			else
				break;
		}
		cout<<now<<endl;
	}
}
2022/10/8 19:41
加载中...