#include <bits/stdc++.h>
#include "jumps.h"
using namespace std;
using ll = long long;
// #define int ll
#define pii pair<int,int>
#define vi vector<int>
#define ff first
#define ss second
#define all(x) x.begin(), x.end()
#define pb push_back
const int INF = 1e9;
const int MOD = 1e9 + 7;
vector<vi> adj;
int N;
void init(int n, std::vector<int> a) {
N = n;
adj.assign(n, vi());
vi nxt(n, -1), prev(n, -1);
stack<int> s;
for (int i = 0; i<n; i++) {
while (!s.empty() && a[s.top()] < a[i]) {
s.pop();
}
if (!s.empty()) prev[i] = s.top();
s.push(i);
}
while (!s.empty()) s.pop();
for (int i = n-1; i>=0; i--) {
while (!s.empty() && a[s.top()] < a[i]) {
s.pop();
}
if (!s.empty()) nxt[i] = s.top();
s.push(i);
}
for (int i = 0; i<n; i++) {
if (nxt[i] != -1) adj[i].pb(nxt[i]);
if (prev[i] != -1) adj[i].pb(prev[i]);
}
}
int minimum_jumps(int A, int B, int C, int D) {
int n = N;
vi mn(n, INF);
queue<int> q;
for (int i = A; i <= B; i++) {
mn[i] = 0;
q.push(i);
}
vector<bool> vis(n, false);
while (!q.empty()) {
int u = q.front();
q.pop();
if (vis[u]) continue;
vis[u] = true;
for (auto &v : adj[u]) {
mn[v] = min(mn[v], mn[u]+1);
q.push(v);
}
}
int ans = INF;
for (int i = C; i<=D; i++) {
ans = min(ans, mn[i]);
}
if (ans == INF) ans = -1;
return ans;
}