Submission #918364

#TimeUsernameProblemLanguageResultExecution timeMemory
918364denniskimPassport (JOI23_passport)C++17
100 / 100
743 ms168324 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef __int128 lll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef pair<ld, ld> pld;
#define MAX 9223372036854775807LL
#define MIN -9223372036854775807LL
#define INF 0x3f3f3f3f3f3f3f3f
#define fi first
#define se second
#define fastio ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cout << fixed; cout.precision(10);
#define sp << " "
#define en << "\n"
#define compress(v) sort(v.begin(), v.end()), v.erase(unique(v.begin(), v.end()), v.end())

ll n;
pll a[200010];
ll q;
ll X;
vector<pll> vec[1000010], yuk[1000010];
ll num[1000010];
ll dist[1000010];
ll A[1000010], B[1000010];
ll siz;
ll ans[1000010];

void init(ll no, ll s, ll e)
{
	siz = max(siz, no);
	
	if(s == e)
	{
		num[s] = no;
		return;
	}
	
	vec[no << 1].push_back({no, 0});
	vec[no << 1 | 1].push_back({no, 0});
	
	init(no << 1, s, (s + e) >> 1);
	init(no << 1 | 1, ((s + e) >> 1) + 1, e);
}

void update(ll no, ll s, ll e, ll l, ll r, ll V)
{
	if(e < l || r < s)
		return;
	
	if(l <= s && e <= r)
	{
		vec[no].push_back({V, 1});
		return;
	}
	
	update(no << 1, s, (s + e) >> 1, l, r, V);
	update(no << 1 | 1, ((s + e) >> 1) + 1, e, l, r, V);
}

void f(ll sta)
{
	for(ll i = 0 ; i <= siz ; i++)
		dist[i] = INF / (siz + 10);
	
	deque<ll> dq;
	
	dist[sta] = 0;
	dq.push_back(sta);
	
	while(!dq.empty())
	{
		ll qq = dq.front();
		dq.pop_front();
		
		for(auto &i : vec[qq])
		{
			if(dist[i.fi] > dist[qq] + i.se)
			{
				if(i.se == 0)
				{
					dist[i.fi] = dist[qq];
					dq.push_front(i.fi);
				}
				
				else
				{
					dist[i.fi] = dist[qq] + 1;
					dq.push_back(i.fi);
				}
			}
		}
	}
}

void f2(ll sta)
{
	priority_queue<pll> pq;
	
	for(ll i = 1 ; i <= siz ; i++)
		dist[i] = INF;
	
	dist[sta] = 0;
	pq.push({0, sta});
	
	while(!pq.empty())
	{
		pll qq = pq.top();
		pq.pop();
		
		for(auto &i : vec[qq.se])
		{
			if(dist[i.fi] > dist[qq.se] + i.se)
			{
				dist[i.fi] = dist[qq.se] + i.se;
				pq.push({-dist[i.fi], i.fi});
			}
		}
	}
}

int main(void)
{
	fastio
	
	cin >> n;
	
	for(ll i = 1 ; i <= n ; i++)
		cin >> a[i].fi >> a[i].se;
	
	init(1, 1, n);
	
	for(ll i = 1 ; i <= n ; i++)
		update(1, 1, n, a[i].fi, a[i].se, num[i]);
	
	f(num[1]);
	
	for(ll i = 1 ; i <= siz ; i++)
		A[i] = dist[i];
	
	f(num[n]);
	
	for(ll i = 1 ; i <= siz ; i++)
		B[i] = dist[i];
	
	for(ll i = 1 ; i <= n ; i++)
		vec[siz + 1].push_back({num[i], max(A[num[i]] - 1, 0LL) + max(B[num[i]] - 1, 0LL) + 1});
	
	siz++;
	
	f2(siz);
	
	for(ll i = 1 ; i <= siz ; i++)
		ans[i] = dist[i];
	
	cin >> q;
	
	while(q--)
	{
		cin >> X;
		
		if(ans[num[X]] >= INF / (siz + 10))
			cout << -1 en;
		else
			cout << ans[num[X]] en;
	}
	
	return 0;
}
#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...