#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 int INF = 1e9; int main() { cin.tie(0)->sync_with_stdio(0); int n, t, k; cin >> n >> t >> k; assert(1 <= k && k <= t && t <= 1e9); 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 = [&](int v) { return (int)(lower_bound(all(coords), v) - coords.begin()); }; vector transitions(sz(coords), INF); for(int i = 0; i < n; i++) { int S = comp(s[i]); int E = comp(e[i]); assert(S < E); transitions[S] = min(transitions[S], 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 && transitions[i] != INF) { 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"; }