Submission #1154446

#TimeUsernameProblemLanguageResultExecution timeMemory
1154446beabossPassport (JOI23_passport)C++20
100 / 100
1081 ms115820 KiB
// Source: 

#include "bits/stdc++.h"

using namespace std;

#define s second
#define f first
#define pb push_back

typedef long long ll;

typedef pair<int, int> pii;
typedef vector<pii> vpii;

typedef vector<int> vi;

#define FOR(i, a, b) for (int i = (a); i<b; i++)

bool ckmin(int& a, int b){ return b < a ? a = b, true : false; }

bool ckmax(int& a, int b){ return b > a ? a = b, true : false; }

const int N = 2e5 + 10;

vpii adj[6 * N];
vi d1(6 * N, N + 1);
vi dn(6 * N, N + 1);
vi db(6 * N, N + 1);

int n;

void connect(int ul, int ur, int node, int i = 1, int l = 1, int r = n+1) {
	if (r <= ul || ur <= l) return;
	if (r <= ur && l >= ul) {
		adj[i + 2*n].pb({node, 0});
		return;
	}
	int m = (l + r)/2;
	connect(ul, ur, node, 2*i, l, m);
	connect(ul, ur, node, 2*i+1, m, r);
}

void build(int i = 1, int l = 1, int r = n+1) {
	if (r - l == 1) {
		adj[l].pb({i + 2*n, 0});
		return;
	}
	int m = (l + r)/2;

	adj[2*i + 2*n].pb({i + 2*n, 0});
	adj[2*i+1 + 2*n].pb({i + 2*n, 0});

	build(2*i, l, m);
	build(2*i+1, m, r);

}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cin >> n;
	build();
	vi all;
	FOR(i, 1, n+1) {
		adj[i + n].pb({i, 1});
		int l, r;
		cin >> l >> r;
		if (l == 1 && r == n) all.pb(i);
		connect(l, r+1, i+n);
	}

	deque<int> d;
	d.push_back(1);
	d1[1]=0;

	while (!d.empty()) {
		int cur = d.front();
		d.pop_front();
		for (auto val: adj[cur]) {
			if (d1[val.f] > d1[cur] + val.s) {
				d1[val.f] = d1[cur] + val.s;
				if (val.s == 0) d.push_front(val.f);
				else d.push_back(val.f);
			}
		}
	}

	d.push_back(n);
	dn[n]=0;

	while (!d.empty()) {
		int cur = d.front();
		d.pop_front();
		// cout << cur << dn[cur] << endl;
		for (auto val: adj[cur]) {
			if (dn[val.f] > dn[cur] + val.s) {
				dn[val.f] = dn[cur] + val.s;
				if (val.s == 0) d.push_front(val.f);
				else d.push_back(val.f);
			}
		}
	}

	priority_queue<pii> pq;

	FOR(i, 1, 6*n+1) {
		db[i]=d1[i] + dn[i];
		pq.push({-db[i], i});
	}

	while (!pq.empty()) {
		pii cur = pq.top();
		pq.pop();
		if (-cur.f != db[cur.s]) continue;
		for (auto val: adj[cur.s]) {
			if (db[val.f] > db[cur.s] + val.s) {
				db[val.f] = db[cur.s] + val.s;
				pq.push({-db[val.f], val.f});
			}
		}
	}

	



	int q;
	cin >> q;

	FOR(_, 0, q) {
		int x;
		cin >> x;
		int res = db[x];
		if (res > n) cout << -1 << endl;
		else cout << res << 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...