#include <bits/stdc++.h>
using namespace std;
template <typename T>
void cmax(T& a, T b) {
  a = max(a, b);
}
template <typename T>
void cmin(T& a, T b) {
  a = min(a, b);
}
void _BG(const char* s) {}
template <typename T, typename... TT>
void _BG(const char* s, T a, TT... b) {
  for (int c = 0; *s && (c || *s != ','); ++s) {
    cerr << *s;
    switch (*s) {
      case '(':
      case '[':
      case '{':
        ++c;
        break;
      case ')':
      case ']':
      case '}':
        --c;
        break;
    }
  }
  cerr << " = " << a;
  if (*s) {
    cerr << ", ";
    _BG(++s, b...);
  } else
    cerr << endl;
}
bool RD(void) { return true; }
bool RD(char& a) { return scanf(" %c", &a) == 1; }
bool RD(char* a) { return scanf("%s", a) == 1; }
bool RD(double& a) { return scanf("%lf", &a) == 1; }
bool RD(int& a) { return scanf("%d", &a) == 1; }
bool RD(long long& a) { return scanf("%lld", &a) == 1; }
template <typename T, typename... TT>
bool RD(T& a, TT&... b) {
  return RD(a) && RD(b...);
}
void PT(const char a) { putchar(a); }
void PT(const char* a) { fputs(a, stdout); }
void PT(char* a) { fputs(a, stdout); }
void PT(const double a) { printf("%.16f", a); }
void PT(const int a) { printf("%d", a); }
void PT(const long long a) { printf("%lld", a); }
template <char sep = ' ', char end = '\n'>
void PL(void) {
  if (end) PT(end);
}
template <char sep = ' ', char end = '\n', typename T, typename... TT>
void PL(const T a, const TT... b) {
  PT(a);
  if (sizeof...(b) && sep) PT(sep);
  PL<sep, end>(b...);
}
const int N = 8e5 + 87;
const int inf = 1e9;
struct Dinic {
  int n, s, t;
  vector<pair<int, int> > e;
  vector<int> g[N];
  int lv[N], idx[N];
  void init(int _n, int _s, int _t) {
    n = _n;
    s = _s;
    t = _t;
  }
  void add(int u, int v, int c) {
    e.emplace_back(v, c);
    g[u].push_back(((int)e.size()) - 1);
    e.emplace_back(u, 0);
    g[v].push_back(((int)e.size()) - 1);
  }
  bool bfs() {
    fill_n(lv, n, 0);
    lv[s] = 1;
    queue<int> q;
    q.push(s);
    while (((int)q.size())) {
      int u = q.front();
      if (u == t) break;
      q.pop();
      for (int i : g[u])
        if (e[i].second) {
          int v = e[i].first;
          if (!lv[v]) {
            lv[v] = lv[u] + 1;
            q.push(v);
          }
        }
    }
    return lv[t];
  }
  int dfs(int u, int a) {
    if (u == t) return a;
    if (lv[u] == lv[t]) return 0;
    int f = 0;
    for (int& i = idx[u]; i < ((int)g[u].size()); ++i) {
      int v, w;
      tie(v, w) = e[g[u][i]];
      if (!w || lv[v] != lv[u] + 1) continue;
      int k = dfs(v, min(a, w));
      e[g[u][i]].second -= k;
      e[g[u][i] ^ 1].second += k;
      a -= k;
      f += k;
      if (!a) break;
    }
    return f;
  }
  int mf() {
    int f = 0;
    while (bfs()) {
      fill_n(idx, n, 0);
      f += dfs(s, inf);
    }
    return f;
  }
} fl;
int main() {
  int n;
  RD(n);
  int m;
  RD(m);
  int v = 2 + n + m * 3;
  fl.init(v, v - 2, v - 1);
  for (int i(0), _B(n); i < _B; ++i) fl.add(fl.s, i, 1);
  for (int i(0), _B(m); i < _B; ++i) fl.add(n + i, fl.t, 1);
  for (int i(0), _B(m); i < _B; ++i) {
    fl.add(n + m + i, n + i, 1);
    if (i) fl.add(n + m + i, n + m + i - 1, i);
  }
  for (int i(0), _B(m); i < _B; ++i) {
    fl.add(n + 2 * m + i, n + i, 1);
    if (i < m - 1) fl.add(n + 2 * m + i, n + 2 * m + i + 1, m - i - 1);
  }
  for (int i(0), _B(n); i < _B; ++i) {
    int l;
    RD(l);
    int r;
    RD(r);
    --l, --r;
    if (l >= 0) fl.add(i, n + m + l, 1);
    if (r < m) fl.add(i, n + 2 * m + r, 1);
  }
  PL(n - fl.mf());
}
