#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
inline int read(){
	register int x=0;
	register char ch=getchar();
	while(ch<'0'||ch>'9')	ch=getchar();
	while(ch>='0'&&ch<='9')	x=x*10+(ch^48),ch=getchar();
	return x;
}
const int N=3e5+5;
struct each{
	int x,y;
	bool operator < (const each k) const{
		return x<k.x;
	}
}a[N];
struct stac{
	int l,r,val;
}st1[N],st2[N];
int n,w,h,ans,top1,top2;
bool com(each x,each y){
	return x.y<y.y;
}
//{{{ sub
namespace sub{
	void work(){
		sort(a+1,a+n+1,com);
		ans=max(a[1].y,h-a[n].y)+w;
		for(int i=2;i<=n;i++)	ans=max(ans,a[i].y-a[i-1].y+w);

		sort(a+1,a+n+1);
		ans=max(ans,max(a[1].x,w-a[n].x)+h);
		for(int i=2;i<=n;i++)	ans=max(ans,a[i].x-a[i-1].x+h);
		for(int i=1;i<=n;i++){
			int u=h,d=0;
			for(int j=i+1;j<=n;j++){
				ans=max(ans,u-d+a[j].x-a[i].x);
				if(a[j].y>=a[i].y)	u=min(a[j].y,u);
				else	d=max(a[j].y,d);
			}
		}
		printf("%d\n",ans*2);
	}
}
//}}}
int b[N<<2],lazy[N<<2];
void get(int rt,int z){
	lazy[rt]+=z,b[rt]+=z;
}
void pushdown(int rt){
	get(rt<<1|1,lazy[rt]);
	get(rt<<1,lazy[rt]);
	lazy[rt]=0;
}
void init(int l,int r,int rt,int ty){
	lazy[rt]=0;
	if(l==r){
		b[rt]=ty?w-a[l].x:h-a[l].y;
		return ;
	}
	int mid=(l+r)>>1;
	init(l,mid,rt<<1,ty);
	init(++mid,r,rt<<1|1,ty);
	b[rt]=max(b[rt<<1],b[rt<<1|1]);
}
void add(int l,int r,int x,int y,int z,int rt){
	if(x<=l&&y>=r){
		get(rt,z);
		return ;
	}
	int mid=(l+r)>>1;
	if(lazy[rt])	pushdown(rt);
	if(x<=mid)	add(l,mid,x,y,z,rt<<1);
	if(y>mid)	add(++mid,r,x,y,z,rt<<1|1);
	b[rt]=max(b[rt<<1],b[rt<<1|1]);
}
int query(int l,int r,int x,int y,int rt){
	if(x<=l&&y>=r)	return b[rt];
	int mid=(l+r)>>1,ans=0;
	if(lazy[rt])	pushdown(rt);
	if(x<=mid)	ans=query(l,mid,x,y,rt<<1);
	if(y>mid)	ans=max(ans,query(++mid,r,x,y,rt<<1|1));
	return ans;
}
int main(){
	h=read(),w=read(),n=read();
	for(int i=1;i<=n;i++)	a[i].x=read(),a[i].y=read();
	/*{{{
	if(n<=3000){
		sub::work();
		return 0;
	}
	}}}*/
	a[++n].y=w/2,a[n].x=h;
	a[++n].x=h/2,a[n].y=w;
	sort(a+1,a+n+1),init(0,n,1,1);
	for(int i=1;i<=n;i++){
		int l=i;
		ans=max(ans,a[i].x+query(0,n,0,i-1,1));
		st2[++top2].l=i-1,st2[top2].r=i-1,st2[top2].val=0;
		st1[++top1].l=i-1,st1[top1].r=i-1,st1[top1].val=w;
		if(a[i].y>w/2){
			while(top1&&st1[top1].val>=a[i].y){
				add(0,n,st1[top1].l,st1[top1].r,-st1[top1].val,1);
				l=min(l,st1[top1--].l);
			}
			st1[++top1].l=l,st1[top1].r=i-1,st1[top1].val=a[i].y;
			add(0,n,l,i-1,a[i].y,1);
		}
		else{
			while(top2&&st2[top2].val<=a[i].y){
				add(0,n,st2[top2].l,st2[top2].r,st2[top2].val,1);
				l=min(l,st2[top2--].l);
			}
			st2[++top2].l=l,st2[top2].r=i-1,st2[top2].val=a[i].y;
			add(0,n,l,i-1,-a[i].y,1);
		}
	}
	sort(a+1,a+n+1,com);
	init(0,n,1,0),top1=top2=0;
	for(int i=1;i<=n;i++){
		int l=i;
		ans=max(ans,a[i].y+query(0,n,0,i-1,1));
		st2[++top2].l=i-1,st2[top2].r=i-1,st2[top2].val=0;
		st1[++top1].l=i-1,st1[top1].r=i-1,st1[top1].val=h;

		if(a[i].x>h/2){
			while(top1&&st1[top1].val>=a[i].x){
				add(0,n,st1[top1].l,st1[top1].r,-st1[top1].val,1);
				l=min(l,st1[top1--].l);
			}
			st1[++top1].l=l,st1[top1].r=i-1,st1[top1].val=a[i].x;
			add(0,n,l,i-1,a[i].x,1);
		}
		else{
			while(top2&&st2[top2].val<=a[i].x){
				add(0,n,st2[top2].l,st2[top2].r,st2[top2].val,1);
				l=min(l,st2[top2--].l);
			}
			st2[++top2].l=l,st2[top2].r=i-1,st2[top2].val=a[i].x;
			add(0,n,l,i-1,-a[i].x,1);
		}
	}
	printf("%d\n",ans*2);
	return 0;
}


Measured memory_bytes: 16896