#include "jumps.h"
#include <bits/stdc++.h>
using ll = long long;
using namespace std;
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define pb push_back
#define FOR(i, a, b) for(ll i = (a); i < (b); ++i)
#define FORD(i, a, b) for(ll i = (a); i >= (b); --i)
#define ok cout << "ok\n"
ll n;
vector<vector<int>> g;
void init(int N, vector<int> h) {
n = N;
g.assign(n, vector<int>());
vector<int> stk;
FOR(i, 0, n) {
while(!stk.empty() && h[stk.back()] <= h[i]) stk.pop_back();
if(stk.size()) {
ll x = stk.back();
g[i].pb(x);
}
stk.pb(i);
}
stk.clear();
FORD(i, n - 1, 0) {
while(!stk.empty() && h[stk.back()] <= h[i]) stk.pop_back();
if(stk.size()) {
ll x = stk.back();
g[i].pb(x);
}
stk.pb(i);
}
}
int minimum_jumps(int A, int B, int C, int D) {
vector<int> vis(n, 0);
queue<pair<int, int>> q;
FOR(i, A, B + 1) {
q.push({i, 0});
vis[i] = 1;
}
while(!q.empty()) {
auto [u, d] = q.front(); q.pop();
if(C <= u && u <= D) {
return d;
}
for(auto &v : g[u]) {
if(vis[v] == 1) continue;
vis[v] = 1;
q.push({v, d + 1});
}
}
return -1;
}