#include<bits/stdc++.h>
using namespace std;
#define FOR(i,a,b) for (int i=(a);i<(b);i++)
#define RFOR(i,a,b) for (int i=(b)-1;i>=(a);i--)
#define REP(i,n) for (int i=0;i<(n);i++)
#define RREP(i,n) for (int i=(n)-1;i>=0;i--)
typedef long long LL;
typedef pair<LL,LL> P;

const LL MAX_N = 1 << 18;

//セグメント木を持つグローバル配列
LL n;
P dat[2*MAX_N-1];

//初期化
void init(LL n_){
   //簡単のために要素数を2のべき乗に
   n=1;
   while(n<n_) n*=2;
   //全ての値をINT_MAXに
   for(int i=0;i<2*n-1;i++) dat[i]=P(1e7,0);
}

//k番目の値(0-indexed)をaに変更
void update(int k,P p){
   //葉の節点
   k+=n-1;
  dat[k]=p;
  //登りながら更新
  while(k>0){
     k=(k-1)/2;
     dat[k] = min(dat[k*2+1],dat[k*2+2]);
  }
}
//[a,b)の最小値を求める
//後ろの方の引数は、計算の簡単のための引数
//kは節点の番号、l,rはその接点が[l,r)に対応していることを表す
//従って外からはquery(a,b,0,0,nと呼ぶ)
P query(int a,int b,int k=0,int l=0,int r=n){
    //[a,b)と[l,r)が交差しなければINT_MAX
    if(r<=a||b<=l) return P(1e7,0);
    //[a,b)が[l,r)を完全に含んでいればこの接点の値
    if(a<=l&&r<=b) return dat[k];
    else{
       //そうでなければ、2つの子の最小値
       P vl =query(a,b,k*2+1,l,(l+r)/2);
       P vr =query(a,b,k*2+2,(l+r)/2,r);
       return min(vl,vr);
    }
}


int N,M;
int L[250001];
int R[250001];
bool used[250001];
vector<P>v;
vector<LL>que;
int main(){
	cin>>N>>M;
	REP(i,N){
	    cin>>L[i]>>R[i];
	    v.push_back(P(R[i],L[i]));
	    //if(i%1000==0)cout<<i<<endl;
	}
	sort(v.begin(),v.end());
	reverse(v.begin(),v.end());

	//初期化
	init(M+10);
	REP(i,M+10){
	    update(i,P(-i,i));
	    used[i]=false;
	    if(i>M){
	       used[i]=true;
	    }
	}
	update(0,P(1e7,0));
        used[0]=true;
        int c=0;
	//Riの大きい方から順に取り出す
	REP(i,N){
	    P q=query(0,v[i].second+1);
	    if(q.first>M){
	       if(used[q.second]==false){
	          int a=0;
	          int b=1/a;
	          return -1;
	       }
	       que.push_back(v[i].first);
	       c++;
	    }else{
	       used[q.second]=true;
	       update(q.second,P(1e7,0));
	    }
	}
	sort(que.begin(),que.end());
	int count=0;
	for(int i=c+1,i<M+1;i++){
	   if(que.size()==count)break;
	   //if(used[i]==false){
	      if(que[count]<=i){
	         count++;
	      }
	   //}
	}
	cout<<max(max(N-M,0),(int)que.size()-count)<<endl;
	return(0);
}