#include <bits/stdc++.h>
using namespace std;
template <typename _tp>
inline void read(_tp& x) {
  char ch = getchar(), ob = 0;
  x = 0;
  while (ch != '-' && !isdigit(ch)) ch = getchar();
  if (ch == '-') ob = 1, ch = getchar();
  while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
  if (ob) x = -x;
}
const int N = 601000;
int sg[N], tag[N];
vector<int> vec[N];
vector<int>::iterator itr;
void build(int l, int r, int x) {
  sg[x] = -l;
  if (l == r) return;
  int mid = l + r >> 1;
  build(l, mid, x << 1);
  build(mid + 1, r, x << 1 | 1);
}
inline void down(int x) {
  int& v = tag[x];
  sg[x << 1] += v, tag[x << 1 | 1] += v, sg[x << 1 | 1] += v, tag[x << 1] += v,
      v = 0;
}
void upd(int l, int r, int x, int L) {
  if (L <= l) return ++sg[x], ++tag[x], void();
  int mid = l + r >> 1;
  if (tag[x]) down(x);
  if (L <= mid) upd(l, mid, x << 1, L);
  upd(mid + 1, r, x << 1 | 1, L);
  sg[x] = max(sg[x << 1], sg[x << 1 | 1]);
}
int qry(int l, int r, int x, int L, int R) {
  if (L <= l and r <= R) return sg[x];
  int mid = l + r >> 1, res = -1e9;
  if (tag[x]) down(x);
  if (L <= mid) res = max(res, qry(l, mid, x << 1, L, R));
  if (mid < R) res = max(res, qry(mid + 1, r, x << 1 | 1, L, R));
  return res;
}
int n, m;
int main() {
  read(n), read(m);
  for (int i = 1, l, r; i <= n; ++i) {
    read(l), read(r);
    vec[r].push_back(l);
  }
  build(1, m, 1);
  int Ans = m;
  for (int r = m + 1; r > 1; --r) {
    for (itr = vec[r].begin(); itr != vec[r].end(); ++itr) upd(1, m, 1, *itr);
    Ans = max(Ans, qry(1, m, 1, 1, r - 1) + r - 1);
  }
  printf("%d\n", Ans - m);
  return 0;
}
