from bisect import bisect_left as lower_bound from bisect import bisect_right as upper_bound class FenwickTree: def __init__(self,x): bit=self.bit=list(x) size=self.size=len(bit) for i in range(size): j=i|(i+1) if j= self.block_size: self.micros[i:i+1]=self.micros[i][:self.block_size >> 1],self.micros[i][self.block_size >> 1:] self.micro_size[i:i+1]=self.block_size >> 1,self.block_size >> 1 self.fenwick=FenwickTree(self.micro_size) self.macro.insert(i,self.micros[i+1][0]) def pop(self,k=-1): i,j=self._find_kth(k) self.size-=1 self.micro_size[i]-=1 self.fenwick.update(i,-1) return self.micros[i].pop(j) def __getitem__(self,k): i,j=self._find_kth(k) return self.micros[i][j] def count(self,x): return self.upper_bound(x)-self.lower_bound(x) def __contains__(self,x): return self.count(x)>0 def lower_bound(self,x): i=lower_bound(self.macro,x) return self.fenwick(i)+lower_bound(self.micros[i],x) def upper_bound(self,x): i=upper_bound(self.macro,x) return self.fenwick(i)+upper_bound(self.micros[i],x) def _find_kth(self,k): return self.fenwick.find_kth(k+self.size if k<0 else k) def __len__(self): return self.size def __iter__(self): return (x for micro in self.micros for x in micro) def __repr__(self): return str(list(self)) (n,),*e=[[*map(int,s.split())]for s in open(0)] p=SortedList() for r,R in sorted(e): i=p.upper_bound(r)-1 if 0<=i