1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <cmath>
5 #include <ctime>
6 #include <climits>
7 #include <string>
8 #include <iterator>
9 #include <algorithm>
10 #include <cstdlib>
11 #include <queue>
12 #include <stack>
13 #include <list>
14 #include <map>
15 #include <vector>
16 #include <iterator>
17 using namespace std;
18 #define PI acos(-1.0)
19 #define INF 0x3f3f3f3f
20 #define MAXN 400005
21 #define MAXM 400005
22 #define MOD 10000
23 #define EPS 1e-6
24 #define rst(a,b) memset(a,b,sizeof(a))
25 #define pd(a) cout << "debug:" << a << " ";
26 #define pp(a) cout << a << " ";
27 #define pl(a) cout << a << endl;
28 #define FOR(a, b, c) for(int a = b; a < c; a++)
29 typedef long long LL;
30 typedef unsigned long long ULL;
31 typedef pair<int,int> pii;
32 struct Line {
33 int num;
34 int li;
35 }line[MAXN];
36 struct node {
37 int l, r;
38 int color;
39 }tree[MAXN*4];
40 int post[MAXN][2];
41 bool cmp(Line a, Line b) {
42 return a.li < b.li;
43 }
44 void build(int c, int l, int r) {
45 tree[c].l = l;
46 tree[c].r = r;
47 tree[c].color = 0;
48 if(l == r) return;
49 else {
50 int mid = (l + r) / 2;
51 build(2*c, l, mid);
52 build(2*c+1, mid+1, r);
53 }
54 }
55 void updata(int c, int l, int r, int color) {
56 if(tree[c].l == l && tree[c].r == r) {
57 tree[c].color = color;
58 //printf("(%d, %d) - %d\n",tree[c].l, tree[c].r, tree[c].color);
59 return;
60 }
61 if(tree[c].color) {
62 tree[2*c].color = tree[c].color;
63 tree[2*c+1].color = tree[c].color;
64 tree[c].color = 0;
65 }
66 int mid = (tree[c].l + tree[c].r) / 2;
67 if(r <= mid) updata(2*c, l, r, color);
68 else if(l > mid) updata(2*c+1, l, r, color);
69 else {
70 updata(2*c, l, mid, color);
71 updata(2*c+1, mid+1, r, color);
72 }
73 }
74 int ans;
75 bool vis[MAXN];
76 void query(int c) {
77 if(tree[c].color) {
78 if(!vis[tree[c].color]) {
79 //printf("(%d - %d)", tree[c].l, tree[c].r);
80 vis[tree[c].color] = 1;
81 ans++;
82 }
83 return;
84 }
85 if(tree[c].l == tree[c].r) return;
86 query(2*c);
87 query(2*c+1);
88 }
89 int main() {
90 //freopen("d:\\input.txt", "r", stdin);
91 int n, l;
92 scanf("%d %d", &n, &l);
93 for(int i = 0; i < n; i++) {
94 scanf("%d %d", &post[i][0], &post[i][1]);
95 line[2*i].li = post[i][0];
96 line[2*i].num = -(i+1);
97 line[2*i+1].li = post[i][1];
98 line[2*i+1].num = i+1;
99 }
100 sort(line, line+2*n, cmp);
101 int tmp = line[0].li;
102 int tp = 1;
103 for(int i = 0; i < 2*n; i++) {
104 if(tmp != line[i].li) {
105 tp += 2;
106 tmp = line[i].li;
107 }
108 if(line[i].num < 0) post[-line[i].num-1][0] = tp;
109 else post[line[i].num-1][1] = tp;
110 }
111 build(1, 1, tp);
112 for(int i = 0; i < n; i++) {
113 //printf("(%d, %d)\n", post[i][0], post[i][1]);
114 updata(1, post[i][0], post[i][1], i+1);
115 }
116 ans = 0;
117 query(1);
118 printf("%d\n", ans);
119 return 0;
120 }