#include <vector>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <cstdio>
#define MAX_V (2*100000) * 2 +100
#define INF MAX_V

using namespace std;

struct edge {int to,cap, rev;};

vector<edge> G[MAX_V];
bool used[MAX_V];

void add_edge(int from, int to, int cap) {
  G[from].push_back((edge){to,cap, G[to].size()});
  G[to].push_back((edge){from, 0,G[from].size()-1});
}

int dfs(int v, int t, int f) {
  if(v==t) return f;
  used[v]=true;
  for(int i=0;i<G[v].size();++i){
    edge& e=G[v][i];
    if(!used[e.to] && e.cap >0){
      int d=dfs(e.to,t,min(f,e.cap));
      if(d>0){
        e.cap-=d;
        G[e.to][e.rev].cap +=d;
        return d;
      }
    }
  }
  return 0;
}

int max_flow(int s,int t) {
  int flow =0;
  for(;;){
    memset(used,0,sizeof(used));
    int f = dfs(s,t,INF);
    if(f==0)return flow;
    flow+=f;
  }
}

int main() {
  int N, M;
  scanf("%d%d", &N, &M);

  for(int i=0;i<N;++i){
    add_edge(0, i+1, 1);
  }

  for(int i=0;i<N;++i){
    int L,R;
    scanf("%d%d", &L, &R);
    for(int j=0;j<L;++j){
      add_edge(i+1, N+j+1, 1);
    }
    for(int j=R-1;j<M;++j){
      add_edge(i+1, N+j+1, 1);
    }
  }

  for(int i=0;i<M;++i){
    add_edge(N+i+1, N+M+1, 1);
  }

  printf("%d", N-max_flow(0, N+M+1));

  return 0;
}