1 #include <iostream>
2 #include <cstdio>
3 #include <cstdlib>
4 #include <cstring>
5 #include <cmath>
6 #include <algorithm>
7 #define min(a, b) ((a) < (b) ? (a) : (b))
8 #define max(a, b) ((a) > (b) ? (a) : (b))
9
10 inline void read(int &x)
11 {
12 x = 0;char ch = getchar(), c = ch;
13 while(ch < ‘0‘ || ch > ‘9‘)c = ch, ch = getchar();
14 while(ch <= ‘9‘ && ch >= ‘0‘)x = x * 10 + ch - ‘0‘, ch = getchar();
15 if(c == ‘-‘)x = -x;
16 }
17
18 const int MAXN = 100 + 10;
19
20 int dp1[MAXN], dp2[MAXN][MAXN], dp3[MAXN][MAXN][MAXN], n, m;
21
22 struct Node
23 {
24 int reach, leave;
25 Node(int _reach, int _leave){reach = _reach, leave = _leave;}
26 Node(){}
27 }node[MAXN];
28
29 bool cmp(Node a, Node b)
30 {
31 return a.reach == b.reach ? a.leave < b.leave : a.reach < b.reach;
32 }
33
34 int ans;
35
36 int main()
37 {
38 read(n), read(m);
39 for(register int i = 1;i <= n;++ i) read(node[i].reach), read(node[i].leave);
40 std::sort(node + 1, node + 1 + n, cmp);
41 if(m == 1)
42 {
43 ans = min(n, 1);
44 for(register int i = 1;i <= n;++ i)
45 {
46 dp1[i] = 1;
47 for(register int j = 1;j <= n;++ j)
48 {
49 if(node[j].reach > node[i].reach)break;
50 if(i == j || node[j].leave > node[i].reach)continue;
51 dp1[i] = max(dp1[i], dp1[j] + 1);
52 }
53 ans = max(ans, dp1[i]);
54 }
55
56 }
57 else if(m == 2)
58 {
59 ans = min(2, n);
60 for(register int i = 1;i <= n;++ i)
61 for(register int j = 1;j <= n;++ j)
62 {
63 if(node[i].reach < node[j].reach)break;
64 if(i == j || node[i].leave < node[j].leave)continue;
65 dp2[i][j] = 2;
66 for(register int k = 1;k <= n;++ k)
67 {
68 if(node[k].reach > node[j].reach)break;
69 if(j == k || i == k || node[k].leave > node[i].reach || node[k].leave > node[j].leave)continue;
70 dp2[i][j] = max(dp2[i][j], dp2[j][k] + 1);
71 }
72 ans = max(ans, dp2[i][j]);
73 }
74 }
75 else
76 {
77 ans = min(n, 3);
78 for(register int i = 1;i <= n;++ i)
79 for(register int j = 1;j <= n;++ j)
80 {
81 if(node[j].reach > node[i].reach)break;
82 if(i == j || node[i].leave < node[j].leave)continue;
83 for(register int k = 1;k <= n;++ k)
84 {
85 if(node[k].reach > node[j].reach)break;
86 if(j == k || i == k || node[j].leave < node[k].leave)continue;
87 dp3[i][j][k] = 3;
88 for(register int l = 1;l <= n;++ l)
89 {
90 if(node[l].reach > node[k].reach )break;
91 if(l == k || l == i || j == l|| node[l].leave > node[i].reach || node[l].leave > node[k].leave)continue;
92 dp3[i][j][k] = max(dp3[i][j][k], dp3[j][k][l] + 1);
93 }
94 ans = max(ans, dp3[i][j][k]);
95 }
96 }
97 }
98 printf("%d", ans);
99 return 0;
100 }