Submission

Status:

[PPPPP][PPPPP][PPPPPPPPPP]

Subtask/Task Score:

{20/20}{30/30}{50/50}

Score: 100

User: mthai

Problemset: ห้องสมุดเมือง 3M

Language: cpp

Time: 0.002 second

Submitted On: 2026-03-04 21:56:46

#include <bits/stdc++.h>
using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int n;
  cin >> n;

  vector<pair<long long, int>> events;
  long long total = 0;

  for (int i = 0; i < n; i++) {
    long long a, b;
    cin >> a >> b;
    events.push_back({a, +1});
    events.push_back({b, -1});
    total += b - a;
  }

  sort(events.begin(), events.end());

  // median อยู่ลำดับที่ floor(K/2) แบบ 1-indexed
  // แปลงเป็น 0-indexed: floor(K/2) - 1
  // แต่ถ้า K=1 ต้อง special case: floor(1/2) = 0 → ลำดับที่ 0 (1-indexed) หมายถึงตัวแรก
  // (0-indexed = 0)
  long long target;
  if (total <= 1) {
    target = 0;
  } else {
    target = total / 2 - 1;
  }

  long long count = 0;
  long long active = 0;

  for (int i = 0; i < (int)events.size(); i++) {
    long long pos = events[i].first;

    // รวม events ที่ตำแหน่งเดียวกัน
    long long delta = 0;
    int j = i;
    while (j < (int)events.size() && events[j].first == pos) {
      delta += events[j].second;
      j++;
    }

    long long nextPos = (j < (int)events.size()) ? events[j].first : pos + 1;
    active += delta;

    if (active > 0) {
      long long span = nextPos - pos;
      long long booksInSpan = active * span;

      if (count + booksInSpan > target) {
        long long remaining = target - count;
        long long offset = remaining / active;
        cout << pos + offset;
        return 0;
      }
      count += booksInSpan;
    }

    i = j - 1;
  }
}