Submission #1190148

#TimeUsernameProblemLanguageResultExecution timeMemory
1190148tamyteEvent Hopping (BOI22_events)C++20
100 / 100
331 ms21156 KiB
#include <bits/stdc++.h>

using namespace std;


struct RMQ {
	int n;
	vector<pair<int, int>> tree;
	RMQ(int n) {
		this->n = n;
		tree = vector<pair<int, int>>(4 * n + 1, {1e9 + 1, -1});
	}
	void update(int i, int l, int r, int qp, pair<int, int> val) {
		if (l == r) {
			tree[i] = min(tree[i], val);
			return;
		}
		int m = (l + r) / 2;
		if (qp <= m) {
			update(i * 2, l, m, qp, val);
		} else {
			update(i * 2 + 1, m + 1, r, qp, val);
		}
		tree[i] = min(tree[i * 2], tree[i * 2 + 1]);
	}
	void update(int qp, pair<int, int> val) {
		update(1, 0, n - 1, qp, val);
	}
	pair<int, int> query(int i, int l, int r, int ql, int qr) {
		if (l > qr || ql > r) {
			return {1e9 + 1, -1};
		}
		if (ql <= l && r <= qr) {
			return tree[i];
		}
		int m = (l + r) / 2;
		return min(query(i * 2, l, m, ql, qr), 
			query(i * 2 + 1, m + 1, r, ql, qr));
	}
	pair<int, int> query(int ql, int qr) {
		return query(1, 0, n - 1, ql, qr);
	}
};



int main() {
	int n, q;
	cin >> n >> q;
	vector<int> pool;
	vector<int> s(n), e(n);
	RMQ seg(n * 2);
	for (int i = 0; i < n; ++i) {
		cin >> s[i] >> e[i];
		pool.push_back(e[i]);
		pool.push_back(s[i]);
	}
	sort(begin(pool), end(pool));
	pool.erase(unique(begin(pool), end(pool)), end(pool));
	for (int i = 0; i < n; ++i) {
		int r = lower_bound(begin(pool), end(pool), e[i]) - begin(pool);
		seg.update(r, {s[i], i});
	}
	vector<vector<int>> lift(n, vector<int>(20, -1));
	for (int i = 0; i < n; ++i) {
		int r = lower_bound(begin(pool), end(pool), e[i]) - begin(pool);
		int l = lower_bound(begin(pool), end(pool), s[i]) - begin(pool);
		auto p = seg.query(l, r);
		lift[i][0] = p.second;
	}
	for (int j = 1; j < 20; ++j) {
		for (int i = 0; i < n; ++i) {
			if (lift[i][j - 1] == -1) continue;
			lift[i][j] = lift[lift[i][j - 1]][j - 1];
		}
	}
	while (q--) {
		int x, y;
		cin >> x >> y;
		--x; --y;
		if (x == y) {
			cout << "0\n";
			continue;
		}
		if (s[y] <= e[x] && e[x] <= e[y]) {
			cout << "1\n";
			continue;
		}
		int steps = 2;
		// cout << x << " " << y << " => ";
		// cout << "X = " << s[x] << " , " << e[x] << endl;
		// cout << "Y = " << s[y] << " , " << e[y] << endl;
		for (int j = 19; j >= 0; --j) {
			if (lift[y][j] == -1) {
				continue;
			}
			int ny = lift[y][j];
			// cout << ny << "\n";
			// cout << "CAND = " << s[ny] << " " << e[ny] << endl;
			if (e[x] < s[ny]) {
				y = ny;
				steps += (1 << j);
			} 
		}
		y = lift[y][0];
		// cout << x << " " << y << endl;
		if (y == -1) {
			cout << "impossible\n";
			continue;
		}
		// cout << "X = " << s[x] << " , " << e[x] << endl;
		// cout << "Y = " << s[y] << " , " << e[y] << endl;
		if (e[x] < s[y] || e[x] > e[y]) {
			cout << "impossible\n";
			continue;
		}
		cout << steps << "\n";
	}
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...