#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef vector VI; typedef pair PII; #define REP(i,s,t) for(int i=(s);i<(t);i++) #define FILL(x,v) memset(x,v,sizeof(x)) #define MAXN 5005 const ll INF = (int)1e18; ll dp[2*MAXN][MAXN]; int main() { int n, t, k; cin >> n >> t >> k; vector meets; VI vs; REP(i,0,n) { int s, e; cin >> s >> e; meets.push_back({e, s}); vs.push_back(s); vs.push_back(e); } vs.push_back(0); sort(vs.begin(), vs.end()); vs.erase(unique(vs.begin(), vs.end()), vs.end()); int vsz = (int)vs.size(); sort(meets.begin(), meets.end()); REP(i,0,vsz) REP(j,0,n+1) dp[i][j] = INF; dp[0][0] = 0; int pe = 0; REP(i,0,n) { int e = lower_bound(vs.begin(), vs.end(), meets[i].first) - vs.begin(); if (e > pe) { REP(ce,pe+1,e+1) REP(j,0,n+1) dp[ce][j] = min(dp[ce][j], dp[ce-1][j]); pe = e; } int s = lower_bound(vs.begin(), vs.end(), meets[i].second) - vs.begin(); int len = meets[i].first - meets[i].second; REP(j,0,i+1) { if (dp[s][j] != INF) dp[e][j+1] = min(dp[e][j+1], dp[s][j] + len); } } for (int i = n; i >= 0; i--) { if (t - dp[vsz - 1][i] >= k) { cout << i << endl; break; } } return 0; }