#include<bits/stdc++.h>
#define int long long
#define f0r(i,n) for(int i = 0; i < n; i++)
#define FOR(i,k,n) for(int i = k; i < n; i++)
#define pb push_back
#define mp make_pair
#define eb emplace_back
#define F first
#define S second
#define vi vector<int>
#define pii pair<int,int>
#define dout(x) cout<<x<<' '<<#x<<endl
#define dout2(x,y) cout<<x<<' '<<#x<<' '<<y<<' '<<#y<<endl
#define vout(v) cout<<#v<<": "; for(auto u : v)cout<<u<<' '; cout<<endl
using namespace std;
struct segtree{
int n; vector<pii> tree;
segtree(vi &a){
n = a.size(); tree.resize(4*n+5); build(1,0,n-1,a);
}
void pull(int v){tree[v]=min(tree[v*2],tree[v*2+1]);}
void build(int v, int tl, int tr, vi &a){
if(tl==tr){tree[v] = mp(a[tl], tl); return;}
int tm = tl + tr >> 1; build(v*2,tl,tm,a); build(v*2+1,tm+1,tr,a); pull(v);
}
pii quer(int v, int tl, int tr, int l, int r){
if(tl > r || tr < l)return mp(4e18,4e18); if(tl >= l && tr <= r)return tree[v];
int tm = tl + tr >> 1; return min(quer(v*2,tl,tm,l,r), quer(v*2+1,tm+1,tr,l,r));
}
int first_less(int v, int tl, int tr, int l, int r, int x){
if(tl > r || tr < l)return -1; if(tree[v].F >= x)return -1; if(tl==tr)return tl;
int tm = tl + tr >> 1; int lef = first_less(v*2,tl,tm,l,r,x); if(lef!=-1)return lef; return first_less(v*2+1,tm+1,tr,l,r,x);
}
int last_less(int v, int tl, int tr, int l, int r, int x){
if(tl > r || tr < l)return -1; if(tree[v].F >= x)return -1; if(tl==tr)return tl;
int tm = tl + tr >> 1; int lef = last_less(v*2+1,tm+1,tr,l,r,x); if(lef!=-1)return lef; return last_less(v*2,tl,tm,l,r,x);
}
};
const int mxn = 1e6 + 5;
int n, d[mxn][2][2], sx, sy, ex, ey;
signed main(){
cin>>n>>sx>>sy>>ex>>ey; sx--,sy--,ex--,ey--; vi h(n); f0r(i,n)cin>>h[i]; segtree S = segtree(h);
vi dn(n), up(n); f0r(i,n)dn[i] = h[i] - 2*i, up[i] = h[i] + 2*i; segtree A = segtree(dn), B = segtree(up);
f0r(i,n){
d[i][0][1] = abs(sx - i) + h[i] - S.quer(1,0,n-1,min(sx,i),max(sx,i)).F;
d[i][1][0] = ey + abs(ex - i);
int l = min(sx,i), r = max(sx,i); int ld = A.quer(1,0,n-1,0,l).S, rd = B.quer(1,0,n-1,r,n-1).S;
d[i][0][0] = min(l + r - 2 * ld + h[ld], 2 * rd - l - r + h[rd]);
d[i][0][0] = min(d[i][0][0], r - l + min(S.quer(1,0,n-1,l,r).F,sy));
l = min(ex,i), r = max(ex,i); int ch = S.quer(1,0,n-1,l,r).F;
if(ch <= ey)d[i][1][1] = r - l + ey - ch; else{
int mn = 4e18;
int lp = S.last_less(1,0,n-1,0,l-1,ey); if(lp != -1){
mn = min(mn, l + r - 2 * lp + ey - h[lp]);
}
int ld = A.quer(1,0,n-1,lp+1,l).S; mn = min(mn, l + r - 2 * ld + h[ld] - ey);
int rp = S.first_less(1,0,n-1,r+1,n-1,ey); if(rp != -1){
mn = min(mn, 2 * rp - l - r + ey - h[rp]);
}
int rd = B.quer(1,0,n-1,r,(rp == -1 ? n : rp) - 1).S; mn = min(mn, 2 * rd - l - r + h[rd] - ey);
d[i][1][1] = mn;
}
}
// dout2(d[0][1][1], d[1][0][0]); dout2(sx,sy);
int ans = 4e18; f0r(i,n-1){
ans = min(ans, d[i][0][1] + d[i+1][1][0] + 1); ans = min(ans, d[i][1][1] + d[i+1][0][0] + 1);
}
int smin = 1e18; for(int i = n-1; i >= 0; i--){
ans = min(ans, d[i][0][1] - i + smin + 2); smin = min(smin, d[i][1][1] + i);
}
smin = 1e18; for(int i = n-1; i >= 0; i--){
ans = min(ans, d[i][1][1] - i + smin + 2); smin = min(smin, d[i][0][1] + i);
}
int ch = S.quer(1,0,n-1,min(sx,ex),max(sx,ex)).F; ch = min(ch, sy); ans = min(ans, abs(sx - ex) + abs(ey - ch)); if(ch > ey){
int mn = ch, pt = 0; for(int i = max(sx, ex) + 1; i < n; i++){
pt+=2; mn = min(mn, h[i]); ans = min(ans, pt + abs(ey - mn) + abs(sx - ex));
}
mn = ch, pt = 0; for(int i = min(sx, ex) - 1; i >= 0; i--){
pt+=2; mn = min(mn, h[i]); ans = min(ans, pt + abs(ey - mn) + abs(sx - ex));
}
}
cout<<ans;
}