Submission #925033

#TimeUsernameProblemLanguageResultExecution timeMemory
925033TAhmed33Rainforest Jumps (APIO21_jumps)C++17
Compilation error
0 ms0 KiB
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 25;
int a[MAXN], prv[MAXN], nxt[MAXN], n;
vector <int> adj[MAXN];
int dep[MAXN], dep2[MAXN], dp[19][MAXN], dp2[19][MAXN];
int idx[MAXN];
void init (int N, vector <int> h) {
	n = N;
	for (int i = 0; i < n; i++) a[i + 1] = h[i];
	stack <int> cur;
	cur.push(1);
	for (int i = 2; i <= n; i++) {
		while (!cur.empty() && a[i] > a[cur.top()]) {
			nxt[cur.top()] = i;
			cur.pop();
		}
		cur.push(i);
	}
	while (!cur.empty()) {
		nxt[cur.top()] = 0;
		cur.pop();
	}
	for (int i = n; i >= 1; i--) {
		dp2[0][i] = nxt[i]; 
		dep2[i] = 1 + dep2[nxt[i]];
	}
	for (int i = 1; i < 19; i++) {
		for (int j = 1; j <= n; j++) {
			dp2[i][j] = dp2[i - 1][dp2[i - 1][j]];
		}
	}
	cur.push(n);
	for (int i = n - 1; i >= 1; i--) {
		while (!cur.empty() && a[i] > a[cur.top()]) {
			prv[cur.top()] = i;
			cur.pop();
		}
		cur.push(i);
	}
	while (!cur.empty()) {
		prv[cur.top()] = 0;
		cur.pop();
	}
	for (int i = 1; i <= n; i++) {
		adj[prv[i]].push_back(i);
		dep[i] = 1 + dep[prv[i]];
		dp[0][i] = prv[i];
	}
	for (int i = 1; i < 19; i++) {
		for (int j = 1; j <= n; j++) {
			dp[i][j] = dp[i - 1][dp[i - 1][j]];
		}
	}
	for (int i = 0; i <= n; i++) {
		sort(adj[i].begin(), adj[i].end());
		for (int j = 0; j < (int)adj[i].size(); j++) {
			idx[adj[i][j]] = j;
		}
	}
}
int jump (int a, int b) {
	for (int i = 18; i >= 0; i--) {
		if (b & (1 << i)) a = dp[i][a];
	}
	return a;
}
int jump2 (int a, int b) {
	for (int i = 18; i >= 0; i--) {
		if (b & (1 << i)) a = dp2[i][a];
	}
	return a;
}
int minimum_jumps (int a, int b, int c, int d) {
	a++; c++;
	if (dep[a] < dep[c]) return -1;
	int x = jump(a, dep[a] - dep[c]);
	if (prv[x] != prv[c]) return -1;
	int l = 0, r = dep2[a], ans = -1;
	while (l <= r) {
		int mid = (l + r) >> 1;
		int u = jump2(a, mid);
		if (dep[u] < dep[c]) {
			r = mid - 1; 
		} else {
			l = mid + 1; ans = mid;
		}
	}
	if (ans == -1) return -1;
	int t = jump2(a, ans);
	int v = jump(t, dep[t] - dep[c]);
	return ans + dep[t] - dep[c] + idx[c] - idx[v];
}
int main () {
	int n, q; cin >> n >> q; vector <int> h(n); for (auto &i : h) cin >> i;
	init(n, h);
	while (q--) {
		int a, b;
		cin >> a >> b;
		cout << minimum_jumps(a, a, b, b) << '\n';
	}
}

Compilation message (stderr)

/usr/bin/ld: /tmp/ccOYd5kG.o: in function `main':
stub.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccH7yNkE.o:jumps.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status