#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n; 
struct SG{
	int cnt,L[400004],R[400004],dat[400004];
	int init(int l,int r){
		int id=++cnt;
		if(l!=r)L[id]=init(l,(l+r)/2),R[id]=init((l+r)/2+1,r);
		dat[id]=n-1;
		return id;
	}
	void push(int id,int x){
		if(dat[id]>x)dat[id]=x;
	}
	int F(int l,int r,int id,int pos){
		if(l==r)return dat[id];
		push(L[id],dat[id]),push(R[id],dat[id]);
		if((l+r)/2>=pos)return F(l,(l+r)/2,L[id],pos);
		return F((l+r)/2+1,r,R[id],pos);
	}
	void upd(int l,int r,int id,int a,int b,int x){
		if(r<a||b<l)return;
		if(a<=l&&r<=b){
			push(id,x);
			return;
		}
		push(L[id],dat[id]),push(R[id],dat[id]);
		upd(l,(l+r)/2,L[id],a,b,x);
		upd((l+r)/2+1,r,R[id],a,b,x);
	}
}T[2];
int Q;
int main(){
	cin>>n>>Q;
	ll cur=1ll*(n-2)*(n-2);
	T[0].cnt=0,T[1].cnt=0;
	T[0].init(1,n-2),T[1].init(1,n-2);
	while(Q--){
		int x,y;cin>>x>>y;
		int op=0;
		if(x==2)x=1,op=1;
		y--;
		int ret=T[op].F(1,n-2,1,y);
		T[op].upd(1,n-2,1,y,y,1);
		cur-=ret-1;
		T[op^1].upd(1,n-2,1,1,ret-1,y);
	}
	cout<<cur;
}