#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#define N 600011
#define INF 0x7f7f7f7f
#define int long long
using namespace std;
struct point{
	int x,y;
	bool operator<(const point &other)const{
		return y<other.y;
	}
}a[N];
struct node{
	int l,r,maxx,ad;
}tree[N*4];
struct apple{
	int no,data,l;
}Stack[2][N],temp;
int top[2],xmax,ymax,n,ans;
void push_up(int now){
	tree[now].maxx=max(tree[now*2].maxx,tree[now*2+1].maxx);
}
void push_down(int now){
	if(tree[now].ad){
		tree[now*2].ad+=tree[now].ad;
		tree[now*2+1].ad+=tree[now].ad;
		tree[now*2].maxx+=tree[now].ad;
		tree[now*2+1].maxx+=tree[now].ad;
		tree[now].ad=0;
	}
}
void build(int l,int r,int now){
	tree[now].l=l;
	tree[now].r=r;
	if(l==r){
		tree[now].maxx=xmax-a[l].y;
		return;
	}
	int mid=(l+r)/2;
	build(l,mid,now*2);
	build(mid+1,r,now*2+1);
	push_up(now);
}
void add(int l,int r,int x,int now){
	if(l<=tree[now].l && tree[now].r<=r){
		tree[now].ad+=x;
		tree[now].maxx+=x;
		return;
	}
	push_down(now);
	int mid=(tree[now].l+tree[now].r)/2;
	if(l<=mid) add(l,r,x,now*2);
	if(r>mid) add(l,r,x,now*2+1);
	push_up(now);
}
int query(int l,int r,int now){
	if(l<=tree[now].l && tree[now].r<=r){
		return tree[now].maxx;
	}
	push_down(now);
	int mid=(tree[now].l+tree[now].r)/2,ret=-INF;
	if(l<=mid) ret=max(ret,query(l,r,now*2));
	if(r>mid) ret=max(ret,query(l,r,now*2+1));
	return ret;
}
void solve(){
	memset(tree,0,sizeof(tree));
	memset(Stack,0,sizeof(Stack));
	memset(top,0,sizeof(top));
	sort(a+1,a+n+1);
	a[n+1].y=ymax;
//	for(int i=1;i<=n;i++){
//		ans=max(ans,xmax+a[i+1].y-a[i].y);
//	}
	build(0,n,1);
	int mid=xmax/2,x;
	temp.no=0,temp.l=100,temp.data=0;Stack[0][++top[0]]=temp;
	temp.no=0,temp.l=100,temp.data=xmax;Stack[1][++top[1]]=temp;
//	a[n+1].x=0,a[n+1].y=ymax;
//	a[n+2].x=xmax,a[n+2].y=ymax;
//ans=0;
	for(int i=1;i<=n;i++){
		ans=max(ans,a[i].y+query(0,i-1,1));
		temp.no=i;
		temp.data=a[i].x;
		int fin=i;
		if(a[i].x<=mid){
			temp.l=Stack[0][top[0]].no;
			add(Stack[0][top[0]].no,i-1,-a[i].x,1);
			while(top[0] && Stack[0][top[0]].data<a[i].x){
				x=Stack[0][top[0]].no;
				add(Stack[0][top[0]].l,x-1,Stack[0][top[0]].data-a[i].x,1);
//				fin=Stack[0][top[0]].l;
				temp.l=min(temp.l,Stack[0][top[0]].l);
				top[0]--;
			}
			Stack[0][++top[0]]=temp;
		}
		else{
			temp.l=Stack[1][top[1]].no;
			add(Stack[1][top[1]].no,i-1,a[i].x-xmax,1);
			while(top[1] && Stack[1][top[1]].data>a[i].x){
				x=Stack[1][top[1]].no;
				add(Stack[1][top[1]].l,x-1,a[i].x-Stack[1][top[1]].data,1);
//				fin=Stack[1][top[1]].l;
				temp.l=min(temp.l,Stack[1][top[1]].l);
				top[1]--;
			}
			Stack[1][++top[1]]=temp;
		}
	}
	ans=max(ans,xmax+ymax-a[n].y);
	ans=max(ans,ymax+query(0,n,1));
}
signed main(){
	scanf("%lld%lld%lld",&xmax,&ymax,&n);
	for(int i=1;i<=n;i++) scanf("%lld%lld",&a[i].x,&a[i].y);
	solve();
	for(int i=1;i<=n;i++) swap(a[i].x,a[i].y);
	swap(xmax,ymax);
	solve();
	printf("%lld",ans*2);
	return 0;
}