##################################################################################################### ##### SortedInterval ##################################################################################################### """ 10^5個の区間まで間に合う ベンチマーク No.674 n連勤: https://yukicoder.me/submissions/617927 """ class Bit: __slots__ = ["n","tree","depth"] def __init__(self,n): """ :param n: number of elements """ self.n=n self.tree=[0]*(n+1) self.depth=n.bit_length()-1 def sum(self,i): """ return summation of elements in [0,i) """ s=0 i-=1 while i>=0: s+=self.tree[i] i=(i&(i+1))-1 return s def build(self,array): """ bulid BIT from array """ for i,a in enumerate(array): self.add(i,a) def add(self,i,x): """ add x to i-th element """ while i=0 """ sum_=0 pos=-1 # 1-indexed の時は pos = 0 if not equal: for i in range(self.depth,-1,-1): k=pos+(1<len(self): sys.stderr.write("nearest: k (= {0}) is larger than the size of this BitSet\n".format(k)) return def test(d): r=self.bisect_right(x+d)-1 l=self.bisect_left(x-d) return r-l+1<=k ok,ng=0,10**18+1 while abs(ok-ng)>1: mid=(ok+ng)//2 if test(mid): ok=mid else: ng=mid d=ok r=self.bisect_right(x+d)-1 l=self.bisect_left(x-d) if d==0: R=self.lower_bound(x,equal=True) L=self.upper_bound(x,equal=True) if abs(x-L)==abs(R-x): if self.count(L)>=k: return L else: return R elif abs(x-L)=len(self)-1: return self[l-1] else: R=self[r+1] L=self[l-1] if abs(x-L)==abs(R-x): if self.count(L)>=k-(r-l+1): return L else: return R elif abs(x-L)=len(self): sys.stderr.write( "__getitem__: index (={0}) is larger than the maximum index (={1})\n".format(k,len(self)-1)) elif k>=0: return self.minimum(k+1) else: sys.stderr.write("__getitem__: index (={0}) is negative \n".format(k)) def __len__(self): return self.size def __iter__(self): """ return sorted list """ for i in range(self.n+1): if self.p[i]: for _ in range(self.p[i]): yield self.decode[i] def __str__(self): """ return sorted list """ text1=" ".join(list(map(str,self))) return "["+text1+"]" class SortedInterval: __slots__ = ["SL","rs","length"] def __init__(self,data): self.SL=SortedList2(data) self.rs={} self.length=0 def add(self,l,r): prev_l=self.SL.upper_bound(l) if prev_l is not None and l<=self.rs[prev_l]: l=prev_l r=max2(r,self.rs[prev_l]) del self.rs[prev_l] self.SL.remove(prev_l) removed=[] next_l=self.SL.lower_bound(l,equal=True) while next_l is not None and next_l<=r: removed.append(next_l) next_l=self.SL.lower_bound(next_l) for next_l in removed: r=max2(r,self.rs[next_l]) del self.rs[next_l] self.SL.remove(next_l) self.SL.add(l) self.rs[l]=r # 新しく生成された区間の大きさを返す return r-l def sum(self): res=0 for l in self.SL: res+=self.rs[l]-l+1 return res def __iter__(self): for l in self.SL: yield l,self.rs[l] def max2(x,y): return x if x>y else y ######################################################### def example(): global input example=iter( """ 30 12 10 10 15 15 10 11 14 15 14 16 9 11 12 14 13 17 19 29 13 18 11 29 0 13 """ .strip().split("\n")) input=lambda:next(example) ######################################################### import sys input=sys.stdin.readline from bisect import bisect_left,bisect_right # example() N,Q=map(int,input().split()) intervals=[] data=[] for _ in range(Q): l,r=map(int,input().split()) intervals.append((l,r)) data.append(l) data.append(r+1) SI=SortedInterval(data) ans=0 for l,r in intervals: ans=max(SI.add(l,r+1),ans) print(ans)