from typing import List from bisect import bisect_left from collections import deque class LazySegTree: def __init__(self, size: int): self.size = 1 while self.size < size: self.size <<= 1 self.lazy = [None] * (2 * self.size - 1) self.seg = [0] * (2 * self.size - 1) def update(self, a: int, b: int, x: int, k: int = 0, l: int = 0, r: int = -1): if r == -1: r = self.size self._lazyprop(k, l, r) if r <= a or b <= l: return if a <= l and r <= b: self.lazy[k] = x self._lazyprop(k, l, r) else: m = (l + r) // 2 self.update(a, b, x, 2 * k + 1, l, m) self.update(a, b, x, 2 * k + 2, m, r) self.seg[k] = max(self.seg[2 * k + 1], self.seg[2 * k + 2]) def get(self, a: int, b: int, k: int = 0, l: int = 0, r: int = -1) -> int: if r == -1: r = self.size if self.lazy[k] is not None: self._lazyprop(k, l, r) if r <= a or b <= l: return 0 if a <= l and r <= b: return self.seg[k] m = (l + r) // 2 return max(self.get(a, b, 2 * k + 1, l, m), self.get(a, b, 2 * k + 2, m, r)) def _lazyprop(self, k: int, l: int, r: int): if self.lazy[k] is not None: self.seg[k] = self.lazy[k] if r - l > 1: self.lazy[2 * k + 1] = self.lazy[k] self.lazy[2 * k + 2] = self.lazy[k] self.lazy[k] = None def max_consecutive_days(D: int, jobs: List[List[int]]) -> List[int]: jobs = sorted(jobs, key=lambda x: x[1]) days = [0] * (2 * len(jobs) + 1) for i in range(len(jobs)): days[2 * i + 1] = jobs[i][0] days[2 * i + 2] = jobs[i][1] + 1 days[-1] = D + 1 dic = {d: i for i, d in enumerate(sorted(set(days)))} seg = LazySegTree(len(dic)) ans = [] for job in jobs: a, b = dic[job[0]], dic[job[1] + 1] seg.update(a, b, seg.get(a, b) + 1) length = seg.get(0, len(dic)) ans.append(length) return ans # 入力受け取り D = int(input()) periods = [] for i in range(Q): a, b = map(int, input().split()) periods.append((a, b)) # 最大連勤日数を計算 ans = max_consecutive_days(D, periods) # 結果を出力 print(ans)