Submission

Status:

[PPPPP][PPPPP][PPPPPPPPPP]

Subtask/Task Score:

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

Score: 100

User: House123

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

Language: cpp

Time: 0.002 second

Submitted On: 2026-03-04 13:55:56

#include <bits/stdc++.h>

using namespace std;
int N;
//find either if it's left or right
//
bool check_LR(int x,long long ans_want_index,int b[],int a[]){
    int index_book =0;
    for(int i = 0; i < N;i++){
        if(x >= b[i]){
            index_book += b[i] - a[i];
        } else if(x >= a[i]){
            index_book += x - a[i]+1;
        }
    }
    
    return index_book >= ans_want_index;// right
    
}

int main(){
    int ans;
    cin >> N;       
    int start[N+3];
    int end[N+3];
    int mn_start = 2e7+5;
    int mx_end = -1;
    long long total_book = 0;
    for(int i = 0; i < N;i++){
        cin >> start[i] >> end[i];
        total_book += (end[i] - start[i]);
        //Acquire interval
        mx_end = max(mx_end, end[i]);
        mn_start = min(mn_start, start[i]);
    }
    const long long ans_want_index = (total_book)/2;
    int left = mn_start;
    int right = mx_end;
    while(left <= right){
        int mid = left + (right - left)/2;
        bool index = check_LR(mid,ans_want_index,end,start);
        
            
        if(index){
            ans = mid;
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    
    cout << ans;
    return 0;
}