#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<set>
#define int long long
#define pii pair<int,int>
#define endl putchar('\n')
using namespace std;
char eof_flag;inline char read(int*s){if(eof_flag)return 0;int k=0,f=1;char c=getchar();while(c!='-'&&(c<'0'||c>'9')){if(c==EOF){eof_flag=1;return 0;}c=getchar();}f=(c=='-')?-1:1;k=(c=='-')?0:(c^48);c=getchar();while(c>='0'&&c<='9')k=(k<<1)+(k<<3)+(c^48),c=getchar();if(c==EOF)eof_flag=1;(*s)=f>0?k:-k;return 1;}
inline void write(int x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10+'0');return;}
struct node
{
int l,r;
mutable int val;
node (int l,int r=-1,int val=0) : l (l),r (r),val (val) {}
bool operator <(const node &x) const {return l<x.l;}
};
set<node> s;
inline auto split(int pos)
{
auto it=s.lower_bound(node(pos));
if (it!=s.end() and it->l==pos) return it;
it--;
if (it->r<pos) return s.end();
int l=it->l,r=it->r,val=it->val;
s.erase(it);
s.insert(node(l,pos-1,val));
return s.insert(node(pos,r,val)).first;
}
inline void assign(int l,int r,int val)
{
auto itr=split(r+1),itl=split(l);
s.erase(itl,itr);
s.insert(node(l,r,val));
return ;
}
inline int sum(int l,int r)
{
auto itr=split(r+1),itl=split(l);
int ans=0;
while(itl!=itr)
{
ans+=(itl->r-itl->l+1)*(itl->val);
itl++;
}
return ans;
}
int n,m;
signed main()
{
read(&n),read(&m);
s.insert(node(1,n,1));
while (m--)
{
int l,r;
read(&l),read(&r);
assign(l,r,0);
}
write(sum(1,n)),endl;
return 0;
}
喵~