//Let's join Kaede Takagaki Fan Club !!
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cassert>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <functional>
#include <iostream>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <cassert>
#include <iomanip>
#include <chrono>
#include <random>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
#define int long long
#define L __int128
typedef long long ll;
typedef pair<int,int> P;
typedef pair<int,P> P1;
typedef pair<P,P> P2;
#define pu push
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define eps 1e-7
#define INF 1000000000
#define a first
#define b second
#define fi first
#define sc second
#define rng(i,a,b) for(int i=(int)(a);i<(int)(b);i++)
#define rep(i,x) for(int i=0;i<x;i++)
#define repn(i,x) for(int i=1;i<=x;i++)
#define SORT(x) sort(x.begin(),x.end())
#define ERASE(x) x.erase(unique(x.begin(),x.end()),x.end())
#define POSL(x,v) (lower_bound(x.begin(),x.end(),v)-x.begin())
#define POSU(x,v) (upper_bound(x.begin(),x.end(),v)-x.begin())
#define all(x) x.begin(),x.end()
#define si(x) int(x.size())
 
#ifdef LOCAL
#define dmp(x) cerr<<__LINE__<<" "<<#x<<" "<<x<<endl
#else
#define dmp(x) void(0)
#endif
 
template<class t,class u> bool chmax(t&a,u b){if(a<b){a=b;return true;}else return false;}
template<class t,class u> bool chmin(t&a,u b){if(b<a){a=b;return true;}else return false;}
 
template<class t> using vc=vector<t>;
 
template<class t,class u>
ostream& operator<<(ostream& os,const pair<t,u>& p){
	return os<<"{"<<p.fi<<","<<p.sc<<"}";
}
 
template<class t> ostream& operator<<(ostream& os,const vc<t>& v){
	os<<"{";
	for(auto e:v)os<<e<<",";
	return os<<"}";
}
 
template<class T>
void g(T &a){
	cin >> a;
}
template<class T>
void o(const T &a,bool space=false){
	cout << a << (space?' ':'\n');
}
//ios::sync_with_stdio(false);
const ll mod = 1000000007;//998244353
mt19937_64 mt(chrono::steady_clock::now().time_since_epoch().count());
template<class T>
void add(T&a,T b){
	a+=b;
	if(a >= mod) a-=mod;
}
ll modpow(ll x,ll n){
	ll res=1;
	while(n>0){
		if(n&1) res=res*x%mod;
		x=x*x%mod;
		n>>=1;
	}
	return res;
}
#define sz 1
ll F[sz],R[sz];
void make(){
	F[0] = 1;
	for(int i=1;i<sz;i++) F[i] = F[i-1]*i%mod;
	for(int i=0;i<sz;i++) R[i] = modpow(F[i],mod-2);
}
ll C(int a,int b){
	if(b < 0 || a < b) return 0;
	return F[a]*R[b]%mod*R[a-b]%mod;
}
void solve(){
	unordered_set<int>ex;
	int n, m;
	cin >> n >> m;
	map<int, vc<int>>M;
	set<P>black;
	
	rep(i, m){
		int x,y; cin >> x >> y;
		M[x].pb(y);
		black.insert(mp(x, y));
	}
	ex.insert(n);
	for(auto at:M){
		vc<int>v = at.b;
		vc<int>zan;
		for(auto k:v){
			for(int a=k-1;a<=k+1;a++){
				if(ex.find(a) != ex.end()){
					zan.pb(a);
					ex.erase(ex.find(a));
				}
			}
		}
		for(auto a:zan){
			if(black.find(mp(at.a, a)) == black.end()) ex.insert(a);
			if(black.find(mp(at.a, a-1)) != black.end()) ex.insert(a-1);
			if(black.find(mp(at.a, a+1)) != black.end()) ex.insert(a+1);
		}
	}
	o(ex.size());
}
signed main(){
	cin.tie(0);
	ios::sync_with_stdio(0);
	cout<<fixed<<setprecision(20);
	int t; t = 1; //cin >> t;
	while(t--) solve();
}

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define fi first
#define se second
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
const int INF = (1<<30) - 1;
const ll LINF = (1LL<<62) - 1;


int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);

    int n, m;
    cin >> n >> m;
    vector<pii> p(m);
    for (int i = 0; i < m; ++i) {
        cin >> p[i].fi >> p[i].se;
    }
    sort(all(p), [&](pii a, pii b) {
        if (a.fi == b.fi) {
            return abs(a.se - n) >= abs(b.se - n);
        } else {
            return a.fi < b.fi;
        }
    });
    if (m == 0) {
        cout << 1 << endl;
        return 0;
    }

    // m > 0
    vector<vector<pii>> query(1);
    int last = p[0].fi;
    for (int i = 0; i < m; ++i) {
        if (p[i].fi == last) {
            query.back().push_back(p[i]);
        } else {
            vector<pii> v = {p[i]};
            query.push_back(v);
            last = p[i].fi;
        }
    }

    int size = 500000;
    int geta = 250000;
    vector<int> num(size, 0);
    num[geta] = 1;

    for (auto v : query) {
        set<int> st = {};
        for (auto q : v) {
            int c = q.se - n + geta;
            if (c - 1 < 0 || c + 2 > size) {
                continue;
            }
            if (num[c] > 0 && num[c - 1] + num[c + 1] == 0) {
                st.insert(c);
            }
        }

        set<int> st2 = {};
        for (auto q : v) {
            int c = q.se - n + geta;
            if (c - 1 < 0 || c + 2 > size) {
                continue;
            }
            if (num[c - 1] + num[c + 1] >= 1) {
                st2.insert(c);
            }
        }

        for (auto c : st2) {
            num[c] = 1;
        }

        for (auto c : st) {
            num[c] = 0;
        }
    }

    int res = 0;
    for (int i = 0; i < size; ++i) {
        if (num[i] > 0) {
            res++;
        }
    }
    cout << res << endl;
}