#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #pragma warning(disable:4996) #define ATCODER #ifdef ATCODER #include #endif typedef long long ll; typedef unsigned long long ull; #define LINF 9223300000000000000 #define LINF2 1223300000000000000 #define LINF3 1000000000000 #define INF 2140000000 //const long long MOD = 1000000007; const long long MOD = 998244353; using namespace std; #ifdef ATCODER using namespace atcoder; #endif void solve() { int n, d; scanf("%d%d", &n, &d); vector p(n), q(n), a(n); vector> z; // p[i],i for (int i = 0; i < n; i++) { scanf("%d%d", &p[i], &q[i]); a[i] = -p[i] + q[i]; z.push_back(make_pair(p[i], i)); } sort(z.begin(), z.end()); vector> vv(n, vector(3,-1)); set> ss; for (int i = 0; i < n; i++) { int id = z[i].second; ss.insert(make_pair(a[id], id)); auto it0 = ss.rbegin(); vv[i][0]= it0->second; it0++; if (it0 == ss.rend()) { continue; } vv[i][1] = it0->second; it0++; if (it0 == ss.rend()) { continue; } vv[i][2] = it0->second; } int l = -1, r = 1000000000; while (r - l > 1) { int m = (l + r) / 2; int bad = 0; map mp0; for (int i = 0; i < d; i++) { if (i == 0) { int val = 0; int diff = m; int k = lower_bound(z.begin(), z.end(), make_pair(diff + 1, -INF))-z.begin(); k--; if (k < 0) { bad = 1; break; } for (int aa = 0; aa < 3; aa++) { if (vv[k][aa] >= 0) { int idne = vv[k][aa]; int valne = val + a[idne]; mp0[idne] = valne; } } if (mp0.empty()) { bad = 1; break; } } else { map mp; auto it0 = mp0.begin(); for (; it0 != mp0.end(); ++it0) { int val = it0->second; int diff = m + val; int k = lower_bound(z.begin(), z.end(), make_pair(diff + 1, -INF)) - z.begin(); k--; if (k < 0) { continue; } for (int aa = 0; aa < 3; aa++) { if (vv[k][aa] >= 0) { int id = it0->first; int idne = vv[k][aa]; if (idne == id) continue; int valne = val + a[idne]; auto it1 = mp.find(idne); if (it1 == mp.end()) { mp[idne] = valne; } else { mp[idne] = max(mp[idne], valne); } } } } if (mp.empty()) { bad = 1; break; } mp0.swap(mp); } } if (bad) { l = m; } else { r = m; } } printf("%d\n", -r); return; } int main() { #if 1 solve(); #else int T, t; scanf("%d", &T); for (t = 0; t < T; t++) { //printf("Case #%d: ", t + 1); solve(); } #endif return 0; }