#include <bits/stdc++.h>
using namespace std;
inline void Fail() {
  printf("0");
  exit(0);
}
const int maxn = 200005;
int n, m, ans, mn = 1e9;
pair<int, int> pos[maxn];
class segtree {
 public:
  int t[maxn * 4], tag[maxn * 4];
  void push_down(int v) {
    if (tag[v]) {
      t[v] += tag[v];
      tag[v << 1] += tag[v];
      tag[v << 1 | 1] += tag[v];
      tag[v] = 0;
    }
  }
  void push_up(int v) { t[v] = max(t[v << 1], t[v << 1 | 1]); }
  void build(int v, int l, int r) {
    if (l == r) {
      t[v] = l;
      tag[v] = 0;
      return;
    }
    int mid = (l + r) >> 1;
    build(v << 1, l, mid);
    build(v << 1 | 1, mid + 1, r);
    push_up(v);
  }
  void update(int v, int l, int r, int vl, int vr) {
    push_down(v);
    if (l > vr || r < vl) return;
    if (l >= vl && r <= vr) {
      tag[v]++;
      push_down(v);
      return;
    }
    int mid = (l + r) >> 1;
    update(v << 1, l, mid, vl, vr);
    update(v << 1 | 1, mid + 1, r, vl, vr);
    push_up(v);
  }
  int query(int v, int l, int r, int vl, int vr) {
    push_down(v);
    if (l > vr || r < vl) return 0;
    if (l >= vl && r <= vr) return t[v];
    int mid = (l + r) >> 1;
    int sl = query(v << 1, l, mid, vl, vr),
        sr = query(v << 1 | 1, mid + 1, r, vl, vr);
    push_up(v);
    return max(sl, sr);
  }
} T;
inline void mod(int cur) {
  if (cur < 0) ans = max(ans, -cur);
}
int main() {
  scanf("%d%d", &n, &m);
  for (int(i) = 1; (i) <= n; i++) scanf("%d%d", &pos[i].first, &pos[i].second);
  sort(pos + 1, pos + 1 + n);
  T.build(1, 1, m + 1);
  for (int(i) = 1; (i) <= n; i++) {
    T.update(1, 1, m + 1, 1, pos[i].second);
    int cur = T.query(1, 1, m + 1, pos[i].first + 1, pos[i].second);
    mn = min(mn, pos[i].second);
    mod(pos[i].first + m + 1 - cur);
    if (mn <= pos[i].first) mod(m - i);
  }
  printf("%d", ans);
  return 0;
}
