#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
const int maxt = 1 << 20;
int n, m;
struct Inte {
  int L, R;
  bool operator<(const Inte &t) const {
    if (L != t.L) return L < t.L;
    return R > t.R;
  }
} a[maxn];
vector<int> chan;
int BIT[maxt], cn;
void ADD(int x) {
  cn++;
  while (x <= m + 1) {
    BIT[x]++;
    x += x & -x;
  }
}
int sum(int x) {
  int s = 0;
  while (x > 0) {
    s += BIT[x];
    x -= x & -x;
  }
  return s;
}
void UPD(int &ans, int rr, int ll) {
  int res = cn - sum(rr - 1);
  ans = max(ans, rr + res - ll);
}
int dat[maxt], mx[maxt], tag[maxt];
void retag(int x, int l, int r) {
  if (l == r) return;
  tag[x * 2] += tag[x];
  tag[x * 2 + 1] += tag[x];
  mx[x * 2] += tag[x];
  mx[x * 2 + 1] += tag[x];
  tag[x] = 0;
  mx[x] = max(mx[x * 2], mx[x * 2 + 1]);
}
void build(int x, int l, int r) {
  if (l == r) {
    mx[x] = l;
    return;
  }
  int mid = (l + r) >> 1;
  build(x * 2, l, mid);
  build(x * 2 + 1, mid + 1, r);
  mx[x] = max(mx[x * 2], mx[x * 2 + 1]);
}
void Insert(int x, int l, int r, int tl, int tr) {
  if (tr < l || tl > r) return;
  retag(x, l, r);
  if (tl <= l && r <= tr) {
    tag[x]++;
    mx[x]++;
    return;
  }
  int mid = (l + r) >> 1;
  Insert(x * 2, l, mid, tl, tr);
  Insert(x * 2 + 1, mid + 1, r, tl, tr);
  mx[x] = max(mx[x * 2], mx[x * 2 + 1]);
}
int query(int x, int l, int r, int tl = 0, int tr = m + 1) {
  if (tr < l || tl > r) return -maxt;
  if (tag[x]) retag(x, l, r);
  if (tl <= l && r <= tr) return mx[x];
  int mid = (l + r) >> 1;
  return max(query(x * 2, l, mid, tl, tr),
             query(x * 2 + 1, mid + 1, r, tl, tr));
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++) scanf("%d%d", &a[i].L, &a[i].R);
  sort(a, a + n);
  build(1, 0, m + 1);
  int AL, AR, AX;
  int ans = m + 1;
  for (int i = 0; i < n;) {
    AL = a[i].L;
    int j = i;
    while (j + 1 < n && a[j + 1].L == AL) j++;
    chan.clear();
    for (int k = i; k <= j; k++) {
      chan.push_back(a[k].R);
      ADD(a[k].R);
      Insert(1, 0, m + 1, 0, a[k].R);
    }
    sort(chan.begin(), chan.end());
    chan.erase(unique(chan.begin(), chan.end()), chan.end());
    for (int k = 0; k < chan.size(); k++) UPD(ans, chan[k], AL);
    int MMMX = query(1, 0, m + 1);
    ans = max(ans, MMMX - AL);
    i = j + 1;
  }
  printf("%d\n", ans - m - 1 + n - m);
  return 0;
}
