1 #include <bits/stdc++.h>
2
3 using namespace std;
4 #define MAXN 40040
5 #define inf 0x3f3f3f3f
6 struct segTree
7 {
8 int l,r,sum;
9 }tree[MAXN];
10 void buildTree (int now,int ll,int rr)
11 {
12 tree[now].l=ll;
13 tree[now].r=rr;
14 if (ll==rr)//如果当前区间长度为1
15 {
16 tree[now].sum=1;//这个区间最开始只有1棵树
17 return;//不写return会炸...
18 }
19 int mid=(ll+rr)/2;
20 int lch=now*2,rch=now*2+1;
21 buildTree(lch,ll,mid);//建左子树
22 buildTree(rch,mid+1,rr);//建右子树
23 tree[now].sum=tree[lch].sum+tree[rch].sum;
24 //父亲节点树木是左右子节点的树木个数的和
25 }
26 void update (int now,int ll,int rr,int x,int y)
27 {
28 if (ll>y||rr<x||tree[now].sum==0)
29 //当[x,y]与当前区间[ll,rr]没有交集时,或此区间的树都已经被拔光了
30 return ;
31 if (x<=ll&&y>=rr)
32 {
33 tree[now].sum=0;//将此区间树拔光
34 return ;
35 }
36 int mid=(ll+rr)/2;
37 int lch=now*2,rch=now*2+1;
38 update(lch,ll,mid,x,y);//二分寻找[ll,rr],使其与[x,y]有交集
39 update(rch,mid+1,rr,x,y);
40 tree[now].sum=tree[lch].sum+tree[rch].sum;
41 }
42 int L,M;
43 int main()
44 {
45 //freopen("de.txt","r",stdin);
46 scanf("%d%d",&L,&M);
47 buildTree(1,1,1+L);
48 for (int i=0;i<M;++i)
49 {
50 int left,right;
51 scanf("%d%d",&left,&right);
52 update(1,1,1+L,left+1,right+1);
53 }
54 printf("%d\n",tree[1].sum);
55 return 0;
56 }