제출 #953790

#제출 시각아이디문제언어결과실행 시간메모리
953790amirhoseinfar1385Passport (JOI23_passport)C++17
46 / 100
1881 ms299288 KiB
#include<bits/stdc++.h>
using namespace std;
const int maxn=200000+10;
int n,q,vasps[maxn],kaf=(1<<18),vassuf[maxn],tedps[maxn],tedsuf[maxn],fasps[maxn],fassuf[maxn],vis[maxn];
pair<int,int>all[maxn];
vector<int>fps,fsuf;
pair<int,int>dp[maxn];
struct cmp {
    bool operator() (pair<int,int> a,pair<int,int> b) const {
  		if(a.first!=b.first){
  			return a.first<b.first;
  		}      
  		if(all[a.second].second!=all[b.second].second){
  			return all[a.second].second>all[b.second].second;
  		}
  		return a<b;
    }
};
set<pair<int,int>,cmp>stdij;
struct segment{
	set<int>seg[(1<<19)];
	void upd(int i,int l,int r,int tl,int tr,int w){
		if(l>r||l>tr||r<tl||tl>tr){
			return ;
		}
		if(l>=tl&&r<=tr){
			if(w<0){
				w=-w;
				seg[i].erase(w);
				return ;
			}
			seg[i].insert(w);
			return ;
		}
		int m=(l+r)>>1;
		return upd((i<<1),l,m,tl,tr,w),upd((i<<1)^1,m+1,r,tl,tr,w);
	}
	int pors(int i){
		i+=kaf;
		while(i>0){
			if((int)seg[i].size()>0){
				return *seg[i].begin();
			}
			i>>=1;
		}
		return -1;
	}
}seg;

void upddij(pair<int,int>x){
	int wtf=seg.pors(x.second);
	while(wtf!=-1){
		seg.upd(1,0,kaf-1,all[wtf].first,all[wtf].second,-wtf);
		all[wtf].second=max(all[wtf].second,dp[x.second].second);
		stdij.insert(make_pair(x.first+1,wtf));
		vis[wtf]=1;
		wtf=seg.pors(x.second);
	}
}

void dij(){
	for(int i=1;i<=n;i++){
		if(all[i].first==1){
			stdij.insert(make_pair(1,i));
			vis[i]=1;
			seg.upd(1,0,kaf-1,all[i].first,all[i].second,-i);
		}
	}
	while((int)stdij.size()>0){
		auto x=*stdij.begin();
		stdij.erase(x);
		dp[x.second]=make_pair(x.first,all[x.second].second);
		upddij(x);
	}
}

void vorod(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>all[i].first>>all[i].second;
	}
}

void pre(){
	set<pair<int,int>>st;
	int now=0;
	while(true){
		int nx=now;
		if((int)st.size()>0){
			nx=max(nx,(*st.rbegin()).first);
		}
		if(nx==now){
			vasps[now]=1;
			st.insert(make_pair(all[now+1].second,now+1));
		}else{
			fps.push_back((*st.rbegin()).second);
			st.clear();
			for(int i=now+1;i<=nx;i++){
				st.insert(make_pair(all[i].second,i));
			}
			now=nx;
		}
		if(now==n){
			break;
		}
	}
	st.clear();
	now=n+1;
	while(true){
		int nx=now;
		if((int)st.size()>0){
			nx=min(nx,(*st.begin()).first);
		}
		if(nx==now){
			vassuf[now]=1;
			st.insert(make_pair(all[now-1].first,now-1));
		}else{
			fsuf.push_back((*st.rbegin()).second);
			st.clear();
			for(int i=now-1;i>=nx;i--){
				st.insert(make_pair(all[i].first,i));
			}
			now=nx;
		}
		if(now==1){
			break;
		}
	}
	for(int i=1;i<=n;i++){
		seg.upd(1,0,kaf-1,all[i].first,all[i].second,i);
		vassuf[i]|=vassuf[i-1];
	}
	for(int i=n;i>=1;i--){
		vasps[i]|=vasps[i+1];
	}
	for(auto x:fps){
		tedps[x]++;
	}
	for(auto x:fsuf){
		tedsuf[x]++;
	}
	for(int i=1;i<=n;i++){
		tedsuf[i]+=tedsuf[i-1];
	}
	for(int i=n;i>=1;i--){
		tedps[i]+=tedps[i+1];
	}
	dij();
}

void khor(){
	int q;
	cin>>q;
	for(int i=0;i<q;i++){
	int x;
	cin>>x;
	if(vis[x]==1&&vasps[all[x].second]==0){
		cout<<dp[x].first+tedps[dp[x].second+1]+(dp[x].second!=n)<<"\n";	
	}else{
		cout<<-1<<"\n";
	}
	}
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
//	freopen("inp.txt","r",stdin);
	vorod();
	pre();
	khor();
}
#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...