Submission #1352644

#TimeUsernameProblemLanguageResultExecution timeMemory
1352644VahanAbrahamEvent Hopping (BOI22_events)C++20
20 / 100
173 ms27248 KiB
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <bitset>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <iomanip>
#include <random>
#include <chrono>
#include <cassert>
#include <math.h>
#include <cmath>
#include <string>
#include <cstring>

using namespace std;

#define ll long long
#define fr first
#define sc second
#define pb push_back

const int N = 100005, N1 = 20;
const ll oo = 1000000000000000, MOD = 1000000007;

pair<int, pair<int,int>> p[N];
int nor_ind[N], pref1[N], pref2[N], up[N][23];
vector<int> g[N];
bool color[N];
vector<pair<int,int>> g1[N];
ll dist[N];
bool ok[5005][5005];

void dfs(int u) {
	color[u] = 1;
	if (g[u].size() == 0) {
		for (int j = 20; j >= 0; --j) {
			up[u][j] = 0;
		}
	}
	else {
		for (int num : g[u]) {
			if (color[num]==0) {
				dfs(num);
			}
		}
		up[u][0] = g[u][0];
		for (int j = 1; j <= 20; ++j) {
			up[u][j] = up[up[u][j - 1]][j - 1];
		}
	}
}

void solve() {
	int n, q;
	cin >> n >> q;
	for (int i = 1; i <= n; ++i) {
		cin >> p[i].fr >> p[i].sc.fr;
		p[i].sc.sc = i;
	}
	sort(p + 1, p + n + 1);
	multiset<pair<int,int>> ms;
	for (int i = 1; i <= n; ++i) {
		ms.insert({ p[i].sc.fr,i });
		auto it = ms.end();
		--it;
		pref1[i] = (*it).sc;
		if (i != 1) {
			--it;
			pref2[i] = (*it).sc;
		}
	}
	for (int i = 1; i <= n; ++i) {
		nor_ind[p[i].sc.sc] = i;
		int x = upper_bound(p + 1, p + n + 1, pair<int, pair<int, int>>{ p[i].sc.fr, { MOD,MOD } }) - p;
		--x;
		int mxind = 0;
		ll mx = 0;
		int mx1ind = pref1[x];
		int mx2ind = pref2[x];
		if (mx1ind == i) {
			if (mx2ind != 0 && p[mx2ind].sc.fr > p[i].sc.fr) {
				g[i].pb(mx2ind);
			}
		}
		else {
			if (p[mx1ind].sc.fr>p[i].sc.fr) {
				g[i].pb(mx1ind);
			}
		}
	}
	for (int i = 1; i <= n; ++i) {
		if (color[i] == 0) {
			dfs(i);
		}
	}
	while (q--) {
		int s, e;
		cin >> s >> e;
		s = nor_ind[s];
		e = nor_ind[e];
		if (s == e) {
			cout << 0 << endl;
			continue;
		}
		int hima = s;
		int cnt = 0;
		for (int j = 20; j >= 0; --j) {
			if (up[hima][j] == 0) {
				continue;
			}
			if (p[up[hima][j]].sc.fr < p[e].sc.fr) {
				hima = up[hima][j];
				cnt += (1 << j);
			}
		}
		if (p[e].fr <= p[hima].sc.fr && p[hima].sc.fr <= p[e].sc.fr) {
			++cnt;
			cout << cnt << endl;
			continue;
		}
		cout << "impossible" << endl;
		
	}
}

int main() {
	int tt = 1;
	//cin >> tt;
	while (tt--) {
		solve();
	}
}
#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...