#include<bits/stdc++.h>
#define N 300005
#define LL long long
#define inf 0x3f3f3f3f
#define pr pair<int,int>
#define mp(x,y) make_pair(x,y)
using namespace std;

int read(){
	char c=getchar();
	int t=0,f=1;
	while(c>'9'||c<'0') f=(c=='-')?-1:1,c=getchar();
	while(c>='0'&&c<='9') t=t*10+c-'0',c=getchar();
	return t*f;
} 

struct point{
	int x,y;
}st[N],p[N],q[N],st1[N],st2[N];

int W,H,n,ans,tp1,tp2,v1[N],v2[N],ed1,ed2;
void upd(int &x,int y){x=(x>y)?x:y;}
bool cmp1(point a,point b){return (a.x==b.x)?(a.y>b.y):(a.x<b.x);}
bool cmp2(point a,point b){return (a.x==b.x)?(a.y<b.y):(a.x<b.x);}

struct Segment_Tree{
	int mx[N<<2],tag[N<<2];
	void pushdown(int x){
		if(!tag[x]) return;
		mx[x<<1]+=tag[x],tag[x<<1]+=tag[x];
		mx[x<<1|1]+=tag[x],tag[x<<1|1]+=tag[x];
		tag[x]=0;
	}
	void build(int x,int L,int R){
		if(L==R) return (void)(mx[x]=(v1[L]+H)<<1);
		int mid=(L+R)>>1;
		build(x<<1,L,mid),build(x<<1|1,mid+1,R);
		mx[x]=max(mx[x<<1],mx[x<<1|1]),tag[x]=0;
	}
	void modify(int x,int L,int R,int l,int r,int v){
		if(l>r) return;
		if(L==l&&R==r) return (void)(mx[x]+=v,tag[x]+=v);
		int mid=(L+R)>>1;
		pushdown(x);
		if(r<=mid) modify(x<<1,L,mid,l,r,v);
		else if(l>mid) modify(x<<1|1,mid+1,R,l,r,v);
		else modify(x<<1,L,mid,l,mid,v),modify(x<<1|1,mid+1,R,mid+1,r,v);
		mx[x]=max(mx[x<<1],mx[x<<1|1]); 
	}
	int query(int x,int L,int R,int l,int r){
		if(l>r) return 0;
		if(L==l&&R==r) return mx[x];
		int mid=(L+R)>>1;
		pushdown(x);
		if(r<=mid) return query(x<<1,L,mid,l,r);
		if(l>mid) return query(x<<1|1,mid+1,R,l,r);
		return max(query(x<<1,L,mid,l,mid),query(x<<1|1,mid+1,R,mid+1,r));
	}
}T;

void del1(int i1,int i2){
	if(p[i1].x==p[i2].x) return;
	int mxx=ed1,lsty=H,lstx=p[i1].x;
	for(int i=tp1;i;i--)if(st1[i].y<p[i1].y){mxx=st1[i].x;break;} 
	upd(ans,T.query(1,1,ed1,p[i1].x+1,mxx)-v1[p[i1].x]*2);
	while(tp1&&st1[tp1].y>=p[i1].y){
		T.modify(1,1,ed1,lstx+1,st1[tp1].x,(v2[p[i1].y]-lsty)<<1);
		lstx=st1[tp1].x,lsty=v2[st1[tp1].y],tp1--;
	}
	if(!tp1) T.modify(1,1,ed1,lstx+1,ed1,(v2[p[i1].y]-lsty)<<1);
	else T.modify(1,1,ed1,lstx+1,st1[tp1].x,(v2[p[i1].y]-lsty)<<1);
	st1[++tp1]=p[i1];
}

void del2(int i1,int i2){
	if(q[i1].x==q[i2].x) return;
	int mxx=ed1,lsty=0,lstx=q[i1].x;
	for(int i=tp2;i;i--)if(st2[i].y>q[i1].y){mxx=st2[i].x;break;} 
	upd(ans,T.query(1,1,ed1,q[i1].x+1,mxx)-v1[q[i1].x]*2);
	while(tp2&&st2[tp2].y<=q[i1].y){
		T.modify(1,1,ed1,lstx+1,st2[tp2].x,(lsty-v2[q[i1].y])<<1);
		lstx=st2[tp2].x,lsty=v2[st2[tp2].y],tp2--;
	}
	if(!tp2) T.modify(1,1,ed1,lstx+1,ed1,(lsty-v2[q[i1].y])<<1);
	else T.modify(1,1,ed1,lstx+1,st2[tp2].x,(lsty-v2[q[i1].y])<<1);
	st2[++tp2]=q[i1];
}

void solve(){
	int n1=0,n2=0;
	for(int i=1;i<=n;i++) (v2[st[i].y]>(H/2))?p[++n1]=st[i]:q[++n2]=st[i];
	sort(p+1,p+n1+1,cmp1),sort(q+1,q+n2+1,cmp2);
	T.build(1,1,ed1),tp1=tp2=0,p[n1+1].x=q[n2+1].x=0;
	int i1=n1,i2=n2;
	while(i1&&i2)
		if(p[i1].x>q[i2].x) del1(i1,i1+1),i1--;
		else del2(i2,i2+1),i2--;
	while(i1) del1(i1,i1+1),i1--;
	while(i2) del2(i2,i2+1),i2--;
	if(!n2) upd(ans,(v1[p[1].x]+H)<<1);
	else if(!n1) upd(ans,(v1[q[1].x]+H)<<1);
	else upd(ans,(v1[min(p[1].x,q[1].x)]+H)<<1);
}

int main(){
	W=read(),H=read(),n=read();
	for(int i=1;i<=n;i++) v1[i]=st[i].x=read(),v2[i]=st[i].y=read();
	v1[n+1]=W,v2[n+1]=H,sort(v1+1,v1+n+2),sort(v2+1,v2+n+2);
	ed1=unique(v1+1,v1+n+2)-v1-1,ed2=unique(v2+1,v2+n+2)-v2-1;
	for(int i=1;i<=n;i++){
		st[i].x=lower_bound(v1+1,v1+ed1+1,st[i].x)-v1;
		st[i].y=lower_bound(v2+1,v2+ed2+1,st[i].y)-v2;
	}
	solve(),swap(W,H),swap(ed1,ed2),swap(v1,v2);
	for(int i=1;i<=n;i++) swap(st[i].x,st[i].y);
	solve(),printf("%d\n",ans);
}

Measured memory_bytes: 23680