#pragma GCC optimize("O3") #include using namespace std; using ll=long long; using P=pair; template using V=vector; #define fi first #define se second #define all(v) (v).begin(),(v).end() const ll inf=(1e18); //const ll mod=998244353; const ll mod=1000000007; const vector dy={-1,0,1,0},dx={0,-1,0,1}; ll GCD(ll a,ll b) {return b ? GCD(b,a%b):a;} ll LCM(ll c,ll d){return c/GCD(c,d)*d;} struct __INIT{__INIT(){cin.tie(0);ios::sync_with_stdio(false);cout< bool chmax(T &a, const T &b) { if (a bool chmin(T &a, const T &b) { if (a>b) { a=b; return 1; } return 0; } templatevoid debag(const vector &a){cerr<<"debag :";for(auto v:a)cerr<void print(const vector &a){for(auto v:a)cout< struct segment_set:set>{ bool merge;//隣接する区間を結合するか segment_set(bool merge=false):merge(merge){ build(); } void build(){ //オーバーフローに気を付ける (*this).emplace(-numeric_limits::max(),-numeric_limits::max()); (*this).emplace(numeric_limits::max(),numeric_limits::max()); } auto get(T p) const{ auto ite= upper_bound({p,p-1}); ite--; if(ite->secondfirst<=l && l<=ite->second){ l=min(l,ite->first); r=max(r,ite->second); (*this).erase(ite); } ite=(*this).lower_bound({l,r}); while(1){ if(l<=ite->first && ite->first<=r){ r=max(r,ite->second); ite=(*this).erase(ite); }else{ break; } } (*this).emplace(l,r); return r-l; } //remove segment [l,r] void remove(T l,U r){ if(merge)r++; if(!same(l,r)){ assert(false);//区間をはみ出している } auto ite=(*this).upper_bound({l,r}); ite--; if(ite->secondfirst>r||ite->secondfirstfirst,nr}); if(nlsecond)insert({nl,ite->second}); (*this).erase(ite); } bool same(T l,U r) const{ auto ite=get(l); return (ite!=(*this).end() && get(l)==get(r)); } }; int main(){ ll D,q; cin>>D>>q; ll ans=0; segment_set st(true); for(int i=0;i>a>>b; chmax(ans,st.add_segment(a,b)); cout<