#include #include #include using namespace std; const int infty = 999999999; struct interval { int fr, to; }; int main() { int num_workers, num_lines; cin >> num_workers >> num_lines; vector workers(num_workers); for (int i=0; i> workers[i].fr >> workers[i].to; } vector first; vector extra; for (int i=0; i= workers[i].fr && workers[j].to <= workers[i].to) { if (workers[j].fr > workers[i].fr || workers[j].to < workers[i].to) { is_covering = true; } else { if (i > j) is_covering = true; } } } if (is_covering) { extra.push_back(workers[i]); } else { first.push_back(workers[i]); } } sort(first.begin(), first.end(), [&] (const interval& a, const interval& b) { return a.fr < b.fr; }); sort(extra.begin(), extra.end(), [&] (const interval& a, const interval& b) { return a.to-a.fr > b.to-b.fr; }); vector> intersection(first.size(), vector(first.size(), -infty)); for (int i=0; i 0) { intersection[i][j] = to-fr; } else { break; } } } vector> best(num_lines+1, vector(first.size()+1, -infty)); best[0][0] = 0; for (int i=0; i