#include <bits/stdc++.h>
#include "jumps.h"
// #include "stub.cpp"
using namespace std;
vector<int> H, L, R;
vector<vector<int>> sp1, sp2;
void init(int n, vector<int> h) {
	H = h;
	
	stack<int> s;
	L = R = vector<int>(n);
	for (int i = 0; i < n; i++) {
		while (!s.empty() && h[s.top()] < h[i]) s.pop();
		L[i] = (s.empty() ? -1 : s.top());
		s.push(i);
	}
	while (!s.empty()) s.pop();
	for (int i = n - 1; i >= 0; i--) {
		while (!s.empty() && h[i] > h[s.top()]) s.pop();
		R[i] = (s.empty() ? -1 : s.top());
		s.push(i);
	}
	sp1 = sp2 = vector<vector<int>>(n, vector<int>(20, -1));
	for (int i = 0; i < n; i++) {
		sp1[i][0] = R[i];
		sp2[i][0] = (~L[i] && (!~R[i] || H[L[i]] > H[R[i]]) ? L[i] : R[i]);
	}
	for (int i = 1; i < 20; i++) {
		for (int j = 0; j < n; j++) {
			if (~sp1[j][i - 1]) sp1[j][i] = sp1[sp1[j][i - 1]][i - 1];
			if (~sp2[j][i - 1]) sp2[j][i] = sp2[sp2[j][i - 1]][i - 1];
		}
	}
}
int minimum_jumps(int A, int B, int C, int D) {
	assert(C == D);
	int x = -1;
	for (int i = B; i >= A && H[i] <= H[C]; i--)
		if (!~x || H[i] > H[x]) x = i;
	if (!~x) return -1;
	int cnt = 0;
	for (int i = 19; i >= 0; i--) {
		if (~sp2[x][i] && H[sp2[x][i]] <= H[C]) {
			x = sp2[x][i];
			cnt += 1 << i;
		}
	}
	for (int i = 19; i >= 0; i--) {
		if (~sp1[x][i] && H[sp1[x][i]] <= H[C]) {
			x = sp1[x][i];
			cnt += (1 << i);
		}
	}
	return (x == C ? cnt : -1);
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |