Problem:
Problem Statement You are given a list of $N$ intervals. The $i$-th interval is $[l_i, r_i)$, which denotes a range of numbers greater than or equal to $l_i$ and strictly less than $r_i$. In this task, you consider the following two numbers:  The minimum integer $x$ such that you can select $x$ intervals from the given $N$ intervals so that the union of the selected intervals is $[0, L)$.  The minimum integer $y$ such that for all possible combinations of $y$ intervals from the given $N$ interval, it does cover $[0, L)$.  We ask you to write a program to compute these two numbers. Input The input consists of a single test case formatted as follows. $N$ $L$
$l_1$ $r_1$
$l_2$ $r_2$
$\vdots$
$l_N$ $r_N$ The first line contains two integers $N$ ($1 \leq N \leq 2 \times 10^5$) and $L$ ($1 \leq L \leq 10^{12}$), where $N$ is the number of intervals and $L$ is the length of range to be covered, respectively. The $i$-th of the following $N$ lines contains two integers $l_i$ and $r_i$ ($0 \leq l_i < r_i \leq L$), representing the range of the $i$-th interval $[l_i, r_i)$. You can assume that the union of all the $N$ intervals is $[0, L)$ Output Output two integers $x$ and $y$ mentioned in the problem statement, separated by a single space, in a line. Examples Input Output 3 3
0 2
1 3
1 2 2 3 2 4
0 4
0 4 1 1 5 4
0 2
2 4
0 3
1 3
3 4 2 4

Solution (Python):
import heapq
import sys
from operator import itemgetter

input = sys.stdin.readline
N, L = map(int, input().split())
LR = []
LR_set = []
for _ in range(N):
  l, r = map(int, input().split())
  LR.append((l, r))
  LR_set.append(l)
  LR_set.append(r)
LR_set = sorted(set(LR_set))
mapping = {}

for i, lr in enumerate(LR_set):
  mapping[lr] = i


imos = [0] * (len(mapping)+1)

LR.sort(key=itemgetter(0))
q = []
ans_x = 0
right = 0
for i, (l, r) in enumerate(LR, 1):
  
  heapq.heappush(q, -r)
  
  if i<N and LR[i][0] > right:
    rr = heapq.heappop(q)
    rr = -rr
    right = rr
    ans_x += 1

  
  imos[mapping[l]] += 1
  imos[mapping[r]] -= 1

if L > right:
  ans_x += 1

for i in range(1, len(imos)):
  imos[i] += imos[i-1]

ans_y = N + 1 - min(imos[:mapping[L]])

print(ans_x, ans_y)