Submission #1344398

#TimeUsernameProblemLanguageResultExecution timeMemory
1344398PieArmyPassport (JOI23_passport)C++20
100 / 100
749 ms30032 KiB
#include<bits/stdc++.h>
typedef long long ll;
#define pb push_back
#define fr first
#define sc second
#define endl '\n'
using namespace std;
#define mid ((left+right)>>1)

struct Seg{
	int n,t;
	pair<int,int>bad;
	vector<pair<int,int>>tree;
	pair<int,int> comp(pair<int,int>a,pair<int,int>b){
		if(t)return max(a,b);
		return min(a,b);
	}
	void init(int N,int T){
		n=N;
		t=T;
		if(t)bad={0,0};
		else bad={n+1,n+1};
		tree.clear();
		tree.resize(n<<2,bad);
	}
	int l,r;
	void up(int node=1,int left=1,int right=-1){
		if(right==-1)right=n;
		if(left==right){
			tree[node]={r,left};
			return;
		}
		if(l>mid)up(node*2+1,mid+1,right);
		else up(node*2,left,mid);
		tree[node]=comp(tree[node*2],tree[node*2+1]);
	}
	void update(int tar,int x){
		l=tar;r=x;
		up();
	}
	pair<int,int> qu(int node=1,int left=1,int right=-1){
		if(right==-1)right=n;
		if(left>=l&&right<=r)return tree[node];
		if(left>r||right<l)return bad;
		return comp(qu(node*2,left,mid),qu(node*2+1,mid+1,right));
	}
	pair<int,int> query(int left,int right){
		l=left;r=right;
		if(l>r)return bad;
		return qu();
	}
};

int n;
pair<int,int>ara[200023];
int a[200023],b[200023];
Seg mn,mx;
vector<int>v[200023];
int ans[200023];

signed main(){
	ios_base::sync_with_stdio(23^23);cin.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>ara[i].fr>>ara[i].sc;
	}
	mn.init(n,0);mx.init(n,1);
	for(int i=1;i<=n;i++){
		a[i]=n+1;
		if(ara[i].fr==1){
			a[i]=0;
			v[a[i]].pb(i);
		}
		mn.update(i,ara[i].fr);
		mx.update(i,ara[i].sc);
	}
	for(int i=0;i<n;i++){
		while(v[i].size()){
			int pos=v[i].back();
			v[i].pop_back();
			if(a[pos]!=i)continue;
			while(true){
				pair<int,int>p=mx.query(1,pos-1);
				if(p.fr<pos)break;
				if(a[p.sc]>a[pos]+1){
					a[p.sc]=a[pos]+1;
					v[a[p.sc]].pb(p.sc);
				}
				mx.update(p.sc,0);
			}
			while(true){
				pair<int,int>p=mn.query(pos+1,n);
				if(p.fr>pos)break;
				if(a[p.sc]>a[pos]+1){
					a[p.sc]=a[pos]+1;
					v[a[p.sc]].pb(p.sc);
				}
				mn.update(p.sc,n+1);
			}
		}
	}
	mn.init(n,0);mx.init(n,1);
	for(int i=1;i<=n;i++){
		b[i]=n+1;
		if(ara[i].sc==n){
			b[i]=0;
			v[b[i]].pb(i);
		}
		mn.update(i,ara[i].fr);
		mx.update(i,ara[i].sc);
	}
	for(int i=0;i<n;i++){
		while(v[i].size()){
			int pos=v[i].back();
			v[i].pop_back();
			if(b[pos]!=i)continue;
			while(true){
				pair<int,int>p=mx.query(1,pos-1);
				if(p.fr<pos)break;
				if(b[p.sc]>b[pos]+1){
					b[p.sc]=b[pos]+1;
					v[b[p.sc]].pb(p.sc);
				}
				mx.update(p.sc,0);
			}
			while(true){
				pair<int,int>p=mn.query(pos+1,n);
				if(p.fr>pos)break;
				if(b[p.sc]>b[pos]+1){
					b[p.sc]=b[pos]+1;
					v[b[p.sc]].pb(p.sc);
				}
				mn.update(p.sc,n+1);
			}
		}
	}
	mn.init(n,0);mx.init(n,1);
	for(int i=1;i<=n;i++){
		mn.update(i,ara[i].fr);
		mx.update(i,ara[i].sc);
		ans[i]=a[i]+b[i]+1;
		if(ans[i]>n)continue;
		v[ans[i]].pb(i);
	}
	for(int i=1;i<=n;i++){
		while(v[i].size()){
			int pos=v[i].back();
			v[i].pop_back();
			if(ans[pos]!=i)continue;
			while(true){
				pair<int,int>p=mx.query(1,pos-1);
				if(p.fr<pos)break;
				if(ans[p.sc]>ans[pos]+1){
					ans[p.sc]=ans[pos]+1;
					v[ans[p.sc]].pb(p.sc);
				}
				mx.update(p.sc,0);
			}
			while(true){
				pair<int,int>p=mn.query(pos+1,n);
				if(p.fr>pos)break;
				if(ans[p.sc]>ans[pos]+1){
					ans[p.sc]=ans[pos]+1;
					v[ans[p.sc]].pb(p.sc);
				}
				mn.update(p.sc,n+1);
			}
		}
	}
	for(int i=1;i<=n;i++){
		if(ans[i]>n)ans[i]=-1;
	}
	int q;cin>>q;
	while(q--){
		int x;cin>>x;
		cout<<ans[x]<<endl;
	}
}
#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...