#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i,n) for(ll i = 0;i<((ll)(n));i++)
#define reg(i,a,b) for(ll i = ((ll)(a));i<=((ll)(b));i++)
#define irep(i,n) for(ll i = ((ll)(n)-1);i>=0;i--)
#define ireg(i,a,b) for(ll i = ((ll)(b));i>=((ll)(a));i--)
template<class T = int> using V = vector<T>;
template<class T = int> using VV = V< V<T> >;
template<class T = int> void print(vector<T> v){for(auto a:v)cout<<a<<" ";cout<<endl;}

template<class T> struct BIT {  // 0-origin
	vector<T> dat;
	int N;
	BIT(){}
	BIT(int _N){
		N=_N;
		dat.assign(N,0);
	}
	// sum [0,i)
	T sum(int i){
		int ret = 0;
		for(--i; i>=0; i=(i&(i+1))-1) ret += dat[i];  // 可換群の演算
		return ret;
	}
	// sum [i,j)
	T sum(int i, int j) { return sum(j) - sum(i); }  // 可換群の逆元
	// add x to i
	void add(int i, T x) { for(; i < N; i|=i+1) dat[i] += x; }  // 可換群の演算
};

/*
*/

struct d{ll x,y;};

ll ans=0;
ll h,w,m;
set<ll> v[200010],v2[200010];

int main(void){
	cin>>h>>w>>m;
	rep(i,m){
		ll x,y;
		cin>>x>>y;
		v[x].insert(y);
		v2[y].insert(x);
	}
	reg(i,1,h)v[i].insert(w+1);
	reg(i,1,w)v2[i].insert(h+1);

	// 右　下
	reg(i,1,h){
		ll t = *v[i].begin();
		ans+=t-1;
		if(t==1)break;
	}

	BIT<ll> bit(200010);
	reg(i,*v2[1].begin(),h)bit.add(i,1);  // これ以降は通れてないので
	reg(i,1,w){
		ll t = *v2[i].begin();
		ans += bit.sum(t);
		for(auto itr = v2[i].begin(); itr!=v2[i].end(); itr++){
			ll a = *itr;
			if(bit.sum(a,a+1)==0)bit.add(a,1);
		}
		if(t==1)break;
	}
	cout<<ans<<endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N=2e5+5;
int n,m,k;
int c[N];
vector<int>v[N];
int lowbit(int x){return x&(-x);}
int query(int i){
	int res=0;
	while(i){
		res+=c[i];
		i-=lowbit(i);
	}
	return res;
}
int getsum(int l,int r){return query(r)-query(l-1);}
void add(int i,int x){
	while(i<=m){
		c[i]+=x;
		i+=lowbit(i);
	}
}
void sub(int i){
	if(getsum(i,i)==1)	add(i,-1);
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	int miny=m+1,minx=n+1;
	for(int i=1;i<=k;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		if(x==1)	miny=min(miny,y);
		if(y==1)	minx=min(minx,x);
		v[x].push_back(y);
	}
	for(int i=1;i<=minx;i++)	sort(v[i].begin(),v[i].end());
	for(int i=1;i<=m;i++)	add(i,1);
	for(int i=miny;i<=m;i++)	sub(i);
	LL res=0;
	for(int i=1;i<=n;i++){
		for(int j=0;j<v[i].size();j++)	sub(v[i][j]);
		if(i<minx){
			if(v[i].empty())	res+=m;
			else{
				res+=v[i][0]-1;
				res+=getsum(v[i][0]+1,m);
			}
		}
		else	res+=getsum(1,m);
	}
	printf("%lld\n",res);
	return 0;
}