#include #include #include #include #include int main() { // Načítame počet vedúcich int N; std::cin >> N; // Načítame začiatočné a koncové body intervalov; true ak je koncový std::vector < std::pair > points; for ( int i = 0; i < N; ++i ) { int b, e; std::cin >> b >> e; points.push_back(std::make_pair(b, false)); points.push_back(std::make_pair(e, true)); } // Zoradíme body vzostupne; v prípade, začiatok a koniec je rovnaký bod, uprednostníme začiatok pred koncom std::sort(points.begin(), points.end()); // Udržujeme si: // Maximálny počet vedúcich, ktorý sa vedia v jeden moment stretnúť int max = 0; // Počet vedúcich, ktorý sa vedia stretnúť v aktuálnom intervale int cur = 0; // Začiatok aktuálneho intervalu int begin = INT_MIN; // Samotné intervaly, v ktorých sa vie stretnúť "max" vedúcich std::vector < std::pair > intervals; for ( size_t i = 0; i < points.size(); ++i ) { if ( points[i].second ) { // Vetva pre koncový bod if ( max == cur ) // V prípade, že je to koncový bod s maximálnym počtom vedúcich, zaradíme interval do zoznamu intervals.push_back(std::make_pair(begin, points[i].first)); --cur; // A od tohto momentu máme o vedúceho menej } else { // Vetva pre začiatočný bod begin = points[i].first; // Nastavíme nový bod pre začiatočný interval ++cur; // Zvýšime počet vedúcich, ktorý sa môžu stretnúť od "begin" if ( max < cur ) { // Ak sme presiahli posledný maximálny počet, tak zahodíme všetky intervaly (tie sú menšie) intervals.clear(); max = cur; } } } // Vypíšeme výstup std::cout << "Maximal number of people: " << max << std::endl; for ( size_t i = 0; i < intervals.size(); ++i ) std::cout << "begin: " << intervals[i].first << " end: " << intervals[i].second << std::endl; return 0; }