#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return true; } return false; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return true; } return false; }
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define mp make_pair
#define si(x) int(x.size())
const int mod=1000000007,MAX=200005,INF=1<<30;

struct dat{
    int l;
    int r;
};

int ans=0,N,M;

void solve(vector<dat> &S){
    int left=0,right=min(N,M)+1;
    sort(all(S),[](auto a,auto b){
        return a.l>b.l;
    });
    while(right-left>1){
        int mid=(left+right)/2;
        int siz=0,id=0;
        bool ok=true;
        for(int t=mid;t>=1;t--){
            while(id<N&&S[id].l>=t){
                siz++;
                id++;
            }
            
            siz--;
            if(siz<0) ok=false;
        }
        
        if(ok) left=mid;
        else right=mid;
    }
    
    int mid=left;
    
    priority_queue<int> PQ;
    int id=0;
    for(int t=mid;t>=1;t--){
        while(id<N&&S[id].l>=t){
            PQ.push(S[id].r);
            id++;
        }
        PQ.pop();
    }
    while(id<N){
        PQ.push(S[id].r);
        id++;
    }
    
    int cnt=0,now=M;
    while(!PQ.empty()){
        if(PQ.top()<=now){
            PQ.pop();
            cnt++;
            now--;
        }else PQ.pop();
    }
    
    chmax(ans,left+cnt);
}

int main(){
    
    std::ifstream in("text.txt");
    std::cin.rdbuf(in.rdbuf());
    cin.tie(0);
    ios::sync_with_stdio(false);
    
    cin>>N>>M;
    vector<dat> S(N);
    for(int i=0;i<N;i++){
        cin>>S[i].l>>S[i].r;
    }
    solve(S);
    for(int i=0;i<N;i++){
        swap(S[i].l,S[i].r);
        S[i].l=M+1-S[i].l;
        S[i].r=M+1-S[i].r;
    }
    solve(S);
    
    cout<<max(0,N-ans)<<endl;
    
}

