#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define REP(i,n) for(int i=0; i=b; --i) #define ALL(c) (c).begin(), (c).end() typedef long long ll; typedef vector VI; typedef vector VL; typedef vector VVI; typedef vector VVL; typedef pair P; typedef pair PL; const int INF = 1e9; const int M = 1e5 + 10; struct BIT{ int n; VL bit; BIT(){} BIT(int x){ n = x; bit.resize(x+1); } void init(int x){ n = x; bit.resize(x+1); } void add(int i, ll x){ i++; while (i <= n){ bit[i] += x; i += i & -i; } } // [0, i] ll sum(int i){ i++; ll ret = 0; while (i > 0){ ret += bit[i]; i -= i & -i; } return ret; } // [l, r) ll sum(int l, int r){ if (l >= r) return 0; return sum(r-1) - sum(l-1); } }; int main(){ int n, m; cin >> n >> m; vector > p(n); REP(i,n) scanf("%d %d %d", &p[i].second, &p[i].first.first, &p[i].first.second); sort(ALL(p)); reverse(ALL(p)); int solve[5] = {}; REP(i,n) solve[p[i].second]++; BIT one_BIT(M), two_BIT(M); REP(i,n){ if (p[i].second == 1){ one_BIT.add(p[i].first.second, 1); } if (p[i].second == 2){ two_BIT.add(p[i].first.second, 1); } } // cout << endl; // REP(i,n) cout << p[i].second << " " << p[i].first.first << " " << p[i].first.second << endl; int ans = INF; int j = 0; FORR(a,M-1,0){ while (j < n && p[j].first.first >= a){ int b = p[j].first.second; int x = p[j].second; if (x == 0){ one_BIT.add(b, 1); } if (x == 1){ one_BIT.add(b, -1); two_BIT.add(b, 1); } if (x == 2){ two_BIT.add(b, -1); } if (x < 3){ solve[x]--; solve[x+1]++; } j++; } // cout << a << endl; // REP(i,4) cout << solve[i] << " "; // cout << endl; if (solve[3] + solve[2] + solve[1] < m) continue; int ok = 0, ng = M-1; while (ng - ok > 1){ int mi = (ok + ng) / 2; if (solve[3] + solve[2] + one_BIT.sum(mi, M) >= m) ok = mi; else ng = mi; } // cout << ok << " three " << solve[3] + two_BIT.sum(ok, M) << endl; ans = min(ans, solve[3] + (int)two_BIT.sum(ok, M)); } cout << ans << endl; return 0; }