Submission #1308374

#TimeUsernameProblemLanguageResultExecution timeMemory
1308374nguyenletrungPassport (JOI23_passport)C++20
0 / 100
2131 ms591992 KiB
#include<bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define ins insert
#define pb push_back
#define foru(i,a,b) for(int i=a;i<=b;i++)
#define ford(i,a,b) for(int i=a;i>=b;i--)
#define pii pair<int,int>
#define pll pair<ll,ll>
//#define int ll
using namespace std;

int n,nq,L[200005],R[200005];
int lef[20][200005],rig[20][200005];
int rmqlef[20][20][200005],rmqrig[20][20][200005];

int tl[800005],tr[800005];

void build(int id,int l,int r)
{
	if(l==r)
	{
		tl[id]=0;
		tr[id]=0;
		return;
	}
	
	int mid=(l+r)/2;
	
	build(id*2,l,mid);
	build(id*2+1,mid+1,r);
	
	tl[id]=min(tl[id*2],tl[id*2+1]);
	tr[id]=max(tr[id*2],tr[id*2+1]);
}

void updatel(int id,int l,int r,int pos,int w)
{
	if(pos<l||r<pos) return;
	if(l==r)
	{
		tl[id]=w;
		return;
	}
	
	int mid=(l+r)/2;
	
	updatel(id*2,l,mid,pos,w);
	updatel(id*2+1,mid+1,r,pos,w);
	
	tl[id]=min(tl[id*2],tl[id*2+1]);
}

void updater(int id,int l,int r,int pos,int w)
{
	if(pos<l||r<pos) return ;
	if(l==r)
	{
		tr[id]=w;
		return;
	}
	
	int mid=(l+r)/2;
	
	updater(id*2,l,mid,pos,w);
	updater(id*2+1,mid+1,r,pos,w);
	
	tr[id]=max(tr[id*2],tr[id*2+1]);
}

int getl(int id,int l,int r,int u,int v)
{
	if(r<u||v<l) return 1e9;
	if(u<=l&&r<=v)
	{
		return tl[id];
	}
	
	int mid=(l+r)/2;
	
	return min(getl(id*2,l,mid,u,v),getl(id*2+1,mid+1,r,u,v));
}

int getr(int id,int l,int r,int u,int v)
{
	if(r<u||v<l) return -1;
	if(u<=l&&r<=v)
	{
		return tr[id];
	}
	
	int mid=(l+r)/2;
	
	return max(getr(id*2,l,mid,u,v),getr(id*2+1,mid+1,r,u,v));
}

int getlef(int id,int l,int r)
{
	int k=__lg(r-l+1);
	
	return min(rmqlef[k][id][l],rmqlef[k][id][r-(1<<(k))+1]);
}

int getrig(int id,int l,int r)
{
	int k=__lg(r-l+1);
	
	return max(rmqrig[k][id][l],rmqrig[k][id][r-(1<<(k))+1]);
}

bool check(int i,int cnt)
{
	int l=i,r=i;
	for(int i=18;i>=0;i--)
	{
		if((cnt>>(i))&1)
		{
			int newl=l,newr=r;
			newl=getlef(i,l,r);
			newr=getrig(i,l,r);
			l=newl;r=newr;
		}
		
		if(l==1&&r==n) return true;
	}
	
	return false;
}

signed main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
//	freopen(".inp","r",stdin);
//	freopen(".out","w",stdout);
	cin>>n;
	foru(i,1,n) 
	{
		cin>>L[i]>>R[i];
		lef[0][i]=L[i];
		rig[0][i]=R[i];
	}
	
	for(int k=1;k<=18;k++)
	{
		build(1,1,n);
		for(int i=1;i<=n;i++)
		{
			updatel(1,1,n,i,lef[k-1][i]);
			updater(1,1,n,i,rig[k-1][i]);
		}
		
		for(int i=1;i<=n;i++)
		{
			lef[k][i]=getl(1,1,n,lef[k-1][i],rig[k-1][i]);
			rig[k][i]=getr(1,1,n,lef[k-1][i],rig[k-1][i]);
		}
	}
	
	for(int k=0;k<=18;k++)
	{
		for(int i=0;i<=18;i++)
		{
			for(int j=1;j<=n;j++)
			{
				if(k==0)
				{
					rmqlef[k][i][j]=lef[i][j];
					rmqrig[k][i][j]=rig[i][j];
				}
				else
				{
					rmqlef[k][i][j]=min(rmqlef[k-1][i][j],rmqlef[k-1][i][j+(1<<(k-1))]);
					rmqrig[k][i][j]=max(rmqrig[k-1][i][j],rmqrig[k-1][i][j+(1<<(k-1))]);
				}
			}
		}
	}
	
	cin>>nq;
	while(nq--)
	{
		int x;
		cin>>x;
		int l=0,r=n,ans=-1;
		while(l<=r)
		{
			int mid=(l+r)/2;
			
			if(check(x,mid))
			{
				ans=mid;
				r=mid-1;
			}
			else l=mid+1;
		}
		
		cout<<ans<<'\n';
	}
	
	
}
/*
em thi cho du co khoc
cung se den ngay phai quen
thien duong van cho ngay em den
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...