ll rnd(ll mod){ ll ret = seed; seed = (seed * 7 + 13) % 1000000007; return ret % mod + 1; }
ll fpow(ll a, ll b, ll mod){ ll res = 1,ans = a % mod; while(b) { if(b & 1) res = res * ans % mod; ans = ans * ans % mod; b >>= 1; } return res; }
iter split(ll pos){ iter it = s.lower_bound(node(pos,0,0)); if(it != s.end() && it -> l == pos) return it; it --; ll l = it -> l,r = it -> r,v = it -> v; s.erase(it); s.insert(node(l,pos - 1,v)); return s.insert(node(pos,r,v)).first; }
iter split(ll pos){ iter it = s.lower_bound(node(pos,0,0)); if(it != s.end() && it -> l == pos) return it; it --; ll l = it -> l,r = it -> r,v = it -> v; s.erase(it); s.insert(node(l,pos - 1,v)); return s.insert(node(pos,r,v)).first; }
voidassign(ll l,ll r,ll v){ int cnt = 0,len = 0; // cnt代表区间内的和,len代表区间长度 iter itr = split(r + 1),itl = split(l); for(iter it = itl;it != itr;it ++) { len += (it -> r - it -> l + 1); cnt += it -> v * (it -> r - it -> l + 1); } s.erase(itl,itr); s.insert(node(l,r,v)); if (v == 1) sum += (len - cnt); else sum -= cnt; // 更新sum的值 }
iter split(int pos){ iter it = s.lower_bound(node(pos,0,0)); if(it != s.end() && it -> l == pos) return it; it --; int l = it -> l,r = it -> r,v = it -> v; s.erase(it); s.insert(node(l,pos - 1,v)); return s.insert(node(pos,r,v)).first; }
voidassign(int l,int r){ int cnt = 0,len = 0; iter itr = split(r + 1),itl = split(l); for(iter it = itl;it != itr;it ++) { len += (it -> r - it -> l + 1); cnt += it -> v * (it -> r - it -> l + 1); } s.erase(itl,itr); s.insert(node(l,r,0)); sum -= cnt; }
intmain(){ scanf("%d%d",&L,&m); sum = L + 1,s.insert(node(0,L,1)); for(int l,r;m;m --) { scanf("%d%d",&l,&r); assign(l,r); } printf("%d\n",sum); return0; }
intquery(int l,int r){ int ans = 0,sum = 0; iter itr = split(r + 1),itl = split(l); for(;itl != itr;itl ++) // 挨个取出来计数 if(itl -> v) sum += itl -> r - itl -> l + 1; else ans = ans > sum ? ans : sum,sum = 0; return ans > sum ? ans : sum; }
structnode { int l,r; mutableint v; node() {} node(int _l,int _r,int _v): l(_l),r(_r),v(_v) {} constbooloperator < (const node& x) const { return l < x.l; } }; typedefset < node > :: iterator iter; set < node > s; string buf; int n,m; int a[100005];
inlineintread(){ #define gc c = getchar() int d = 0,f = 0,gc; while(c < 48 || c > 57) f |= (c == '-'),gc; while(c > 47 && c < 58) d = (d << 1) + (d << 3) + (c ^ 48),gc; #undef gc return f ? -d : d; }
inlineinttodigit(char c){ // alpha -> digits if('A' <= c && c <= 'Z') return c - 'A' + 1; if('a' <= c && c <= 'z') return c - 'a' + 1; }
iter split(int pos){ iter it = s.lower_bound(node(pos,0,0)); if(it != s.end() && it -> l == pos) return it; it --; int l = it -> l,r = it -> r,v = it -> v; s.erase(it); s.insert(node(l,pos - 1,v)); return s.insert(node(pos,r,v)).first; }
inlineintread(){ #define gc c = getchar() int d = 0,f = 0,gc; for(;c < 48 || c > 57;gc) f |= (c == '-'); for(;c > 47 && c < 58;gc) d = (d << 1) + (d << 3) + (c ^ 48); #undef gc return f ? -d : d; }
iter split(int pos){ iter it = s.lower_bound(node(pos,0,0)); if(it != s.end() && it -> l == pos) return it; it --; int l = it -> l,r = it -> r,v = it -> v; s.erase(it); s.insert(node(l,pos - 1,v)); return s.insert(node(pos,r,v)).first; }
intassign(int l,int r,int v){ int ans = 0; iter itr = split(r + 1),itl = split(l); for(iter it = itl;it != itr;it ++) ans += (it -> r - it -> l + 1) * (it -> v ^ v); s.erase(itl,itr); s.insert(node(l,r,v)); return ans; }
voiddfs2(int u,int tp){ p[u].dfn = ++ tot2; p[u].top = tp; if(!head[u]) return ; dfs2(p[u].hson,tp); for(int i = head[u];i;i = edge[i].g) { int v = edge[i].v; if(v != p[u].fa && v != p[u].hson) dfs2(v,v); } }
voidins(int id){ int res = 0; for(;p[id].top != 1;) { res += assign(p[p[id].top].dfn,p[id].dfn,1); id = p[p[id].top].fa; } res += assign(1,p[id].dfn,1); printf("%d\n",res); }