//Patwari26
//#include template<t> as mine
#include<bits/stdc++.h>
using namespace std;

#define ll          long long
#define pb          push_back
#define endl        '\n'
#define mii         map<ll,ll>
#define pii         pair<ll,ll>
#define vi          vector<ll>
#define all(a)      (a).begin(),(a).end()
#define x           first
#define y           second
#define sz(x)       (ll)x.size()
#define hell        1000000007
#define INF         (1ll<<60)
#define rep(i,a,b)  for(ll i=a;i<=b;i++)
#define rrep(i,a,b)  for(ll i=a;i>=b;i--)
#define ios ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define time        cerr << "\nTime elapsed: " << 1000 * clock() / CLOCKS_PER_SEC << "ms\n";
ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a % b); }
ll lcm(ll a, ll b) { return a * (b / gcd(a, b)); }
const int N=200005;
int seg[4*N][2],lazy[4*N][2];
// void build(int idx,int node,int start,int end){
//     if(start==end){
//         seg[node]=a[start];
//         return;
//     }
//     int mid=(start+end)>>1;
//     build(idx,node<<1,start,mid);
//     build(idx,node<<1|1,mid+1,end);
//     seg[node]=min(seg[node<<1],seg[node<<1|1]);
// }
void update(int idx,int node,int start,int end,int l,int r,int val){
    if(lazy[node][idx]!=hell){
        seg[node][idx]=min(seg[node][idx],lazy[node][idx]);
        if(start!=end){
            lazy[node<<1][idx]=min(lazy[node<<1][idx],lazy[node][idx]);
            lazy[node<<1|1][idx]=min(lazy[node<<1|1][idx],lazy[node][idx]);
        }
        lazy[node][idx]=hell;
    }
    if(start>end || start>r || end<l) return;
    if(l<=start && end<=r){
        seg[node][idx]=min(seg[node][idx],val);
        if(start!=end){
            lazy[node<<1][idx]=min(lazy[node<<1][idx],val);
            lazy[node<<1|1][idx]=min(lazy[node<<1|1][idx],val);
        }
        return;
    }
    int mid=(start+end)>>1;
    update(idx,node<<1,start,mid,l,r,val);
    update(idx,node<<1|1,mid+1,end,l,r,val);
    seg[node][idx]=min(seg[node<<1][idx],seg[node<<1|1][idx]);
}
int query(int idx,int node,int start,int end,int l,int r){
    if(start>end || start>r || end<l) return hell;
    if(lazy[node][idx]!=hell){
        seg[node][idx]=min(seg[node][idx],lazy[node][idx]);
        if(start!=end){
            lazy[node<<1][idx]=min(lazy[node<<1][idx],lazy[node][idx]);
            lazy[node<<1|1][idx]=min(lazy[node<<1|1][idx],lazy[node][idx]);
        }
        lazy[node][idx]=hell;
    }
    if(start>=l && end<=r) return seg[node][idx];
    int mid=(start+end)>>1;
    int q1=query(idx,node<<1,start,mid,l,r);
    int q2=query(idx,node<<1|1,mid+1,end,l,r);
    return min(q1,q2);
}
void solve(){
    ll n,q,x,y,temp;
    cin>>n>>q;
    rep(i,1,4*N-1) rep(j,0,1) seg[i][j]=hell,lazy[i][j]=hell;
    rep(i,1,n) update(0,1,1,n,i,i,n),update(1,1,1,n,i,i,n);
    // cout<<query(1,1,1,n,2,2);
    rep(i,1,q){
        cin>>x>>y;
        if(x==1){
            temp=query(0,1,1,n,y,y);
            // cout<<temp<<" ";
            update(0,1,1,n,y,y,1);
            update(1,1,1,n,1,temp,y);
        }
        else{
            temp=query(1,1,1,n,y,y);
            // cout<<temp<<" ";
            update(1,1,1,n,y,y,1);
            update(0,1,1,n,1,temp,y);
        }
        // ll ans=0;
        // rep(i,2,n-1){
        //     temp=query(0,1,1,n,i,i);
        //     ans+=max(0ll,temp-2);
        //     temp=query(1,1,1,n,i,i);
        //     ans+=max(0ll,temp-2);
        // }
        // cout<<ans<<endl;
    }
    ll ans=0;
    rep(i,2,n-1){
        temp=query(0,1,1,n,i,i);
        // cout<<temp<<" ";
        ans+=max(0ll,temp-2);
        update(1,1,1,n,1,temp,i);
        // temp=query(1,1,1,n,i,i);
        // ans+=max(0ll,temp-2);
    }
    rep(i,2,n-1){
        temp=query(1,1,1,n,i,i);
        ans+=max(0ll,temp-2);
    }
    cout<<ans<<endl;
}
signed main()
{
    ios
    int TESTS=1;
    //cin>>TESTS;
    while(TESTS--){
        solve();
    }
    // time
    return 0;
}

Measured memory_bytes: 16152