#include <bits/stdc++.h>
using namespace std;
using ll = long long;
ll n, l[202020], r[202020], par[202020], lx[202020], rx[202020], rt, dh[202020], pf[202020][20];
array<ll, 2> seg[808080];
vector<int> h;
void dfs(ll x, ll f) {
if (x < 0)
return;
par[x] = f;
pf[x][0] = par[lx[x] == x ? rx[x] : lx[x]];
dh[l[x]] = dh[r[x]] = dh[x] + 1, lx[l[x]] = l[x], rx[r[x]] = r[x], rx[l[x]] = rx[x], lx[r[x]] = lx[x], dfs(l[x], x), dfs(r[x], x);
}
void ini(ll s, ll e, ll d) {
if (s < e)
ini(s, s + e >> 1, d * 2), ini(s + e + 2 >> 1, e, d * 2 + 1), seg[d] = max(seg[d * 2], seg[d * 2 + 1]);
else
seg[d] = {h[s], s};
}
array<ll, 2> fnd(ll l, ll r, ll s = 0, ll e = n - 1, ll d = 1) {
if (s > r || e < l)
return {0, 0};
if (s >= l && e <= r)
return seg[d];
return max(fnd(l, r, s, s + e >> 1, d * 2), fnd(l, r, s + e + 2 >> 1, e, d * 2 + 1));
}
ll dnc(ll s, ll e) {
if (s > e)
return -1;
ll t = fnd(s, e)[1];
l[t] = dnc(s, t - 1), r[t] = dnc(t + 1, e);
return t;
}
void init(int N, vector<int> H) {
h = H;
n = N;
ini(0, n - 1, 1);
rt = dnc(0, n - 1);
lx[rt] = rx[rt] = rt, dh[n] = -1, dfs(rt, n);
for (int k = 1; k < 20; k++) {
pf[n][k - 1] = n;
for (int i = 0; i < n; i++)
pf[i][k] = pf[pf[i][k - 1]][k - 1];
}
}
int minimum_jumps(int A, int B, int C, int D) {
ll bl = fnd(B + 1, C - 1)[0];
D = fnd(C, D)[1];
if (bl > h[D])
return -1;
for (; A <= B;) {
A = fnd(A, B)[1];
if (h[A] < h[D])
break;
A++;
}
if (A > B)
return -1;
for (; C < D;) {
ll pt = fnd(C, D - 1)[1];
if (h[pt] < h[A])
break;
D = pt;
}
ll rs = 0, x = A;
for (int k = 20; k--;)
if (dh[pf[x][k]] >= dh[D])
x = pf[x][k], rs += 1 << k;
return rs + dh[x] - dh[D];
}