#include <bits/stdc++.h>
using namespace std;
int _I() {
  int x;
  scanf("%d", &x);
  return x;
}
long long _L() {
  long long x;
  scanf("%lld", &x);
  return x;
}
long long gcd(long long a, long long b) {
  while (b) b ^= a ^= b ^= a %= b;
  return a;
}
long long lcm(long long x, long long y) {
  x /= gcd(x, y);
  return x * y;
}
int kdx[8] = {-2, -2, -1, -1, 1, 1, 2, 2};
int kdy[8] = {-1, 1, -2, 2, -2, 2, -1, 1};
bool prime[100007];
long long _pow(long long a, long long b) {
  if (b == 0) return 1;
  long long ret = 1;
  ret *= _pow(a, b / 2);
  ret = ret * ret;
  if (b & 1) {
    ret *= a;
  }
  return ret;
}
bool inrng(long long x, long long y, long long c) { return (x <= c && c <= y); }
bool inRng(int a, int b, int x, int y) {
  return (inrng(a, b, x) || inrng(a, b, y) || inrng(x, y, a) || inrng(x, y, b));
}
vector<int> v;
map<int, int> mp;
void sieve() {
  int i, j;
  prime[1] = 1;
  v.push_back(2);
  for (i = 4; i <= 100007; i += 2) prime[i] = 1;
  for (i = 3; i <= 100007; i += 2)
    if (!prime[i]) {
      v.push_back(i);
      for (j = i + i + i; j <= 100007; j += i + i) prime[j] = 1;
    }
}
int cases;
int ar[1001];
int ans;
void lipu_mira() {
  int i, j, n, pos, l, r;
  n = _I();
  pos = _I();
  l = _I();
  r = _I();
  if (l == 1 || r == n) {
    if (l == 1 && r != n) {
      ans += abs(r - pos);
      ans++;
    } else if (l != 1 && r == n) {
      ans += abs(l - pos);
      ans++;
    }
    printf("%d", ans);
    return;
  }
  if (inrng(l, r, pos)) {
    int x = pos - l;
    int y = r - pos;
    ans += min(x, y);
    ans++;
    ans += r - l;
    ans++;
    if (l == 1) ans--;
    if (r == n) ans--;
  } else {
    if (pos > r) {
      ans += pos - r;
      ans++;
      ans += r - l;
      ans++;
      if (l == 1) ans--;
      if (r == n) ans--;
    } else {
      ans += l - pos;
      ans++;
      ans += r - l;
      ans++;
      if (l == 1) ans--;
      if (r == n) ans--;
    }
  }
  printf("%d", ans);
}
int main() {
  lipu_mira();
  return 0;
}
