#include using namespace std; #define rep(i, a, b) for(int i = a; i < (b); ++i) #define all(x) begin(x), end(x) #define sz(x) (int)(x).size() #define pb push_back typedef long long ll; typedef long double ld; typedef vector vi; constexpr ll INF = 1e9; int main() { cin.tie(0)->sync_with_stdio(0); int n, t, k; cin >> n >> t >> k; vector s(n), e(n); vector coords{0, t}; for(int i = 0; i < n; i++) { cin >> s[i] >> e[i]; coords.pb(s[i]); coords.pb(e[i]); } sort(all(coords)); coords.erase(unique(all(coords)), coords.end()); auto comp = [&](ll v) { return (int)(lower_bound(all(coords), v) - coords.begin()); }; vector> transitions(sz(coords)); for(int i = 0; i < n; i++) { int S = comp(s[i]); int E = comp(e[i]); transitions[S].pb(E); } vector> dp(sz(coords), vector(n+1, -INF)); dp[0][0] = 0; for(int i = 0; i < sz(coords)-1; i++) { for(int taken = 0; taken <= n; taken++) { if(dp[i][taken] == -INF) continue; if(taken < n) { for(int next : transitions[i]) { dp[next][taken+1] = max(dp[next][taken+1], dp[i][taken]); } } dp[i+1][taken] = max(dp[i+1][taken], dp[i][taken]+coords[i+1]-coords[i]); } } int ans = 0; for(int take = 0; take <= n; take++) { if(dp[sz(coords)-1][take] >= k) ans = take; } cout << ans << "\n"; }