#include <iostream>
#include <vector>
using namespace std;
const int N = 1<<3;
int nxt[N][20], Nxt[N][20], Mx[N][20], lft[N], rgt[N];
vector<int> A, v;
void init(int n, vector<int> B){
A = B;
A.push_back(n + 1);
for (int i=0;i<=n;i++){
while (v.size() > 0 and A[v.back()] < A[i])
rgt[v.back()] = i, v.pop_back();
v.push_back(i), rgt[i] = n;
}
v = {};
for (int i=n;i>=0;i--){
while (v.size() > 0 and A[v.back()] < A[i])
lft[v.back()] = i, v.pop_back();
v.push_back(i), lft[i] = n;
}
for (int i=0;i<=n;i++){
Nxt[i][0] = rgt[i];
if (A[lft[i]] > A[rgt[i]])
Nxt[i][0] = lft[i];
nxt[i][0] = rgt[i];
if (lft[i] == n)
lft[i] = -1;
}
for (int j=0;j<3;j++){
for (int i=0;i<=n;i++){
nxt[i][j+1] = nxt[nxt[i][j]][j];
Nxt[i][j+1] = Nxt[Nxt[i][j]][j];
}
}
for (int i=n;i>=0;i--){
Mx[i][0] = i;
for (int j=0;j<3;j++){
if (i + (1<<j) < n)
Mx[i][j+1] = (A[Mx[i][j]] > A[Mx[i+(1<<j)][j]] ? Mx[i][j] : Mx[i + (1<<j)][j]);
else
Mx[i][j+1] = Mx[i][j];
}
}
}
int getMx(int l, int r){
// cout<<l<<' '<<r<<endl;
int b = 31 - __builtin_clz(r - l + 1);
return (A[Mx[l][b]] > A[Mx[r - (1<<b) + 1][b]] ? Mx[l][b] : Mx[r - (1<<b) + 1][b]);
}
int minimum_jumps(int a, int b, int c, int d){
int Ans = -1;
for (int i=c;i<=d;i++){
// cout<<i<<endl;
if (lft[i] >= b and lft[i] != A.size() - 1)
continue;
int M = getMx(max(a, lft[i]+1), b), ans = 0;
// cout<<M<<endl;
for (int j=3;j+1;j--){
if (A[Nxt[M][j]] <= A[i])
M = Nxt[M][j], ans += (1<<j);
}
// cout<<M<<endl;
for (int j=3;j+1;j--){
if (A[nxt[M][j]] <= A[i])
M = nxt[M][j], ans += (1<<j);
}
// cout<<M<<endl;
if (Ans == -1 or Ans > ans)
Ans = ans;
}
return Ans;
}