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

template<typename T>
void compress(vector<T>& A) {
  vector<T> vals=A;
  vals.push_back(0);
  sort(vals.begin(),vals.end());
  vals.erase(unique(vals.begin(),vals.end()),vals.end());
  for(auto& e:A) e=distance(vals.begin(),lower_bound(vals.begin(),vals.end(),e));
}

int main() {
  ll N,M; cin>>N>>M;
  // 座標圧縮っぽい
  vector<ll> X,Y;
  ll size;
  ll ans=0;
  for(ll i=0; i<M; ++i) {
    ll x,y; cin>>x>>y;
    y=y-N+M;
    if(y<0 || y>2*M) continue;
    X.push_back(x); Y.push_back(y);
  }
  compress(X);
  size=X.size();
  map<ll,set<ll>> pawn;
  for(ll i=0; i<size; ++i) pawn[Y[i]].insert(X[i]);
  queue<pair<ll,ll>> que;
  map<pair<ll,ll>,bool> seen;
  que.push({0,M});
  seen[{0,M}]=true;
  while(!que.empty()) {
    auto p=que.front();
    que.pop();
    ll limit=LLONG_MAX;
    auto itr=pawn[p.second].upper_bound(p.first);
    if(itr==pawn[p.second].end()) ans++;
    else limit=*itr;
    // 前
    if(p.second-1>=0) {
      itr=pawn[p.second-1].upper_bound(p.first);
      for(;itr!=pawn[p.second-1].end();++itr) {
        if(*itr>limit) break;
        if(seen.count({*itr,p.second-1})==0) {
          que.push({*itr,p.second-1});
          seen[{*itr,p.second-1}]=true;
        }
      }
    }
    // 後
    if(p.second+1<=2*M) {
      itr=pawn[p.second+1].upper_bound(p.first);
      for(;itr!=pawn[p.second+1].end();++itr) {
        if(*itr>limit) break;
        if(seen.count({*itr,p.second+1})==0) {
          que.push({*itr,p.second+1});
          seen[{*itr,p.second+1}]=true;
        }
      }
    }
  }
  cout<<ans<<endl;
}

#include<bits/stdc++.h>

using namespace std;

template <typename A, typename B>
string to_string(pair<A, B> p);

template <typename A, typename B, typename C>
string to_string(tuple<A, B, C> p);

template <typename A, typename B, typename C, typename D>
string to_string(tuple<A, B, C, D> p);

string to_string(const string& s) {
    return '"' + s + '"';
}

string to_string(const char& s) {
    string res = "'";
    res += s;
    res += "'";
    return res;
}

string to_string(bool b) {
    return (b ? "true" : "false");
}

string to_string(vector<bool> v) {
    string res = "{";
    for (int i = 0; i < static_cast<int>(v.size()); i++) {
        if (i) res += ", ";
        res += to_string(v[i]);
    }
    res += "}";
    return res;
}

template <size_t N>
string to_string(bitset<N> v) {
    string res = "";
    for (size_t i = 0; i < N; i++) {
        res += static_cast<char>('0' + v[i]);
    }
    return res;
}

template <typename A>
string to_string(A v) {
    bool first = true;
    string res = "{";
    for (const auto &x : v) {
        if (!first) {
            res += ", ";
        }
        first = false;
        res += to_string(x);
    }
    res += "}";
    return res;
}

template <typename A, typename B>
string to_string(pair<A, B> p) {
    return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
}

template <typename A, typename B, typename C>
string to_string(tuple<A, B, C> p) {
    return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " + to_string(get<2>(p)) + ")";
}

template <typename A, typename B, typename C, typename D>
string to_string(tuple<A, B, C, D> p) {
    return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " + to_string(get<2>(p)) + ", " + to_string(get<3>(p)) + ")";
}

void debug_out() { cerr << endl; }

template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
    cerr << " " << to_string(H);
    debug_out(T...);
}

#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#define int long long
#define fi first
#define se second
#define pii pair<int, int>
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define sz(a) (int) (a).size()
#define eb emplace_back
#define ld long double
#define ve vector
#define forn(i, n) for (int i = 0; i < n; i++)

signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n, m;
    cin >> n >> m;
    ve<pii> a(m);
    forn (i, m) cin >> a[i].fi >> a[i].se;
    sort(all(a));
    a.pb({1e18, 1e18});
    set<int> tmp;
    tmp.insert(n);
    int i = 0;
    while (true) {
        //debug(tmp);
        if (i == m) {
            cout << sz(tmp);
            return 0;
        }
        int j = i;
        while (a[j].fi == a[i].fi) j++;
        ve<int> ban;
        for (int v = i; v < j; v++) ban.pb(a[v].se);
        ve<int> add;
        for (auto x : ban) {
            if (tmp.find(x - 1) != tmp.end() || tmp.find(x + 1) != tmp.end()) add.pb(x);
        }
        //debug(ban, add);
        for (auto x : ban) {
            if (tmp.find(x) != tmp.end()) tmp.erase(x);
        }
        for (auto x : add) tmp.insert(x);
        i = j;
    }
}
