#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vll = vector<ll>;
using vvl = vector<vll>;
using pll = pair<ll,ll>;
using vpl = vector<pll>;
using vvp = vector<vpl>;
#define f first
#define s second
#define pb push_back
#define all(v) v.begin(),v.end()
vvl lef, ri;
vvp bot;
ll n;vector<int> h;
ll lasbf(ll i, ll x){
for(ll j = 19; j >= 0; --j){
if(lef[j][i]>=x){
i=lef[j][i];
}
}
return i;
}
pll calc(ll a, ll b, ll i){
pll ans = {n,-1};
if(a!=-1){
ans.f = min(bot[i][a].f, ans.f);
ans.s = max(bot[i][a].s, ans.s);
}
else ans.f=-1;
if(b!=n){
ans.f = min(bot[i][b].f, ans.f);
ans.s = max(bot[i][b].s, ans.s);
}
else ans.s=n;
return ans;
}
ll he(ll a){
if(a==-1)return -1;
if(a==n)return 1e15;
else return h[a];
}
void init(int N, std::vector<int> H) {n=N;h=H;
vll st;
lef = vvl(20, vll(n,-1));
ri = vvl(20, vll(n,n));
bot = vvp(20, vpl(n,{n,-1}));
for(ll i = 0; i < n; ++i){
while(!st.empty() && h[st.back()]<=h[i]){
st.pop_back();
}
if(st.empty())lef[0][i]=-1;
else lef[0][i] = st.back();
st.pb(i);
}
st.clear();
for(ll i = n-1; i >= 0; --i){
while(!st.empty() && h[st.back()]<=h[i]){
st.pop_back();
}
if(st.empty())ri[0][i]=n;
else ri[0][i] = st.back();
st.pb(i);
bot[0][i] = {lef[0][i],ri[0][i]};
}
for(ll i = 1; i < 20; ++i){
for(ll j = 0; j < n; ++j){
if(lef[i-1][j]!=-1)lef[i][j]=lef[i-1][lef[i-1][j]];
if(ri[i-1][j]!=n)ri[i][j]=ri[i-1][ri[i-1][j]];
bot[i][j] = calc(bot[i-1][j].f, bot[i-1][j].s, i-1);
}
}
}
int minimum_jumps(int a, int b, int c, int d) {
ll mx = lasbf(d,c);
ll bord = lef[0][mx];
if(bord>=b)return -1;
a = max<ll>(a,bord+1);
a = b = lasbf(b,a);
ll ans = 0;
for(ll i = 19; i>=0; --i){
auto [na,nb] = calc(a,b,i);
if(max(he(na),he(nb))<h[mx] && nb<c){
a=na;b=nb;
ans += (1<<i);
}
}
if(he(a)<he(b))swap(a,b);
for(ll i = 19; i>=0; --i){
if(ri[i][a]<c){
a=ri[i][a];
ans += (1<<i);
}
}
return ans+1;
}
// int main() {
// int N, Q;
// assert(2 == scanf("%d %d", &N, &Q));
// std::vector<int> H(N);
// for (int i = 0; i < N; ++i) {
// assert(1 == scanf("%d", &H[i]));
// }
// init(N, H);
// for (int i = 0; i < Q; ++i) {
// int A, B, C, D;
// assert(4 == scanf("%d %d %d %d", &A, &B, &C, &D));
// printf("%d\n", minimum_jumps(A, B, C, D));
// }
// return 0;
// }