#include<set>
#include<map>
#include<deque>
#include<queue>
#include<stack>
#include<cmath>
#include<ctime>
#include<bitset>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<climits>
#include<complex>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;

inline void up(int &a,const int &b){if(a<b)a=b;}
inline void down(int &a,const int &b){if(a>b)a=b;}
const int maxn = 310000;

int n,w,h;
struct point { int x,y; }p[maxn];
inline bool cmpx(const point x,const point y){return x.x<y.x;}
inline bool cmpy(const point x,const point y){return x.y<y.y;}
struct node
{
	int x,i;
	friend inline bool operator <(const node a,const node b){return a.x<b.x;}
}a[maxn];
int tox[maxn],toy[maxn],idx,idy;

void trans()
{
	for(int i=1;i<=n;i++) a[i]=(node){p[i].x,i};
	sort(a+1,a+n+1);
	tox[idx=0]=0;
	for(int i=1;i<=n;i++)
	{
		if(tox[idx]!=a[i].x) tox[++idx]=a[i].x;
		p[a[i].i].x=idx;
	}
	if(tox[idx]!=w) tox[++idx]=w;
	
	for(int i=1;i<=n;i++) a[i]=(node){p[i].y,i};
	sort(a+1,a+n+1);
	toy[idy=0]=0;
	for(int i=1;i<=n;i++)
	{
		if(toy[idy]!=a[i].x) toy[++idy]=a[i].x;
		p[a[i].i].y=idy;
	}
	if(toy[idy]!=h) toy[++idy]=h;
}

struct Segment_Tree
{
	int seg[maxn<<2],flag[maxn<<2];
	void init() { memset(seg,0,sizeof seg); memset(flag,0,sizeof flag); }
	int lx,rx,c;
	void pushdown(int x)
	{
		if(!flag[x]) return;
		int &fl=flag[x],lc=x<<1,rc=lc|1;
		seg[lc]+=fl,seg[rc]+=fl;
		flag[lc]+=fl,flag[rc]+=fl;
		fl=0;
	}
	void upd(const int x,const int l,const int r)
	{
		if(rx<l||r<lx) return;
		if(lx<=l&&r<=rx) { seg[x]+=c;flag[x]+=c;return; }
		pushdown(x);
		int mid=l+r>>1;
		upd(x<<1,l,mid); upd(x<<1|1,mid+1,r);
		seg[x]=max(seg[x<<1],seg[x<<1|1]);
	}
	int query(const int x,const int l,const int r)
	{
		if(rx<l||r<lx) return INT_MIN;
		if(lx<=l&&r<=rx) return seg[x];
		pushdown(x);
		int mid=l+r>>1;
		return max(query(x<<1,l,mid),query(x<<1|1,mid+1,r));
	}
}seg;

int mid,ans;
int tl[maxn],tli[maxn],tpl;
int tr[maxn],tri[maxn],tpr;

void solve1()
{
	seg.init();
	sort(p+1,p+n+1,cmpy);
	/*mid=w>>1; */tpl=tpr=0;
	int pos=1;
	for(int i=1;i<=idy;i++)
	{
		seg.lx=seg.rx=i,seg.c=-toy[i-1],seg.upd(1,1,idy);
		int L=0,R=idx,la;
		while(pos<=n&&p[pos].y<i)
		{
			if(tox[p[pos].x]<=mid) up(L,p[pos].x);
			else down(R,p[pos].x);
			pos++;
		}
		
		la=i;
		while(tl[tpl]<L&&tpl) 
		{
			seg.lx=tli[tpl],seg.rx=la-1,seg.c=tox[tl[tpl]]-tox[L],seg.upd(1,1,idy);
			la=tli[tpl--];
		}
		if(la!=i) tl[++tpl]=L,tli[tpl]=la;
		tl[++tpl]=0,tli[tpl]=i; seg.lx=seg.rx=i,seg.c=mid,seg.upd(1,1,idy);
		
		la=i;
		while(tr[tpr]>R&&tpr)
		{
			seg.lx=tri[tpr],seg.rx=la-1,seg.c=tox[R]-tox[tr[tpr]],seg.upd(1,1,idy);
			la=tri[tpr--];
		}
		if(la!=i) tr[++tpr]=R,tri[tpr]=la;
		tr[++tpr]=idx,tri[tpr]=i; seg.lx=seg.rx=i,seg.c=w-mid,seg.upd(1,1,idy);
		
		seg.lx=1,seg.rx=i; up(ans,seg.query(1,1,idy)+toy[i]);
	}
}
void solve2()
{
	seg.init();
	sort(p+1,p+n+1,cmpx);
	/*mid=h>>1; */tpl=tpr=0;
	int pos=1;
	for(int i=1;i<=idx;i++)
	{
		seg.lx=seg.rx=i,seg.c=-tox[i-1],seg.upd(1,1,idx);
		int L=0,R=idy,la;
		while(pos<=n&&p[pos].x<i)
		{
			if(toy[p[pos].y]<=mid) up(L,p[pos].y);
			else down(R,p[pos].y);
			pos++;
		}
		
		la=i;
		while(tl[tpl]<L&&tpl) 
		{
			seg.lx=tli[tpl],seg.rx=la-1,seg.c=toy[tl[tpl]]-toy[L],seg.upd(1,1,idx);
			la=tli[tpl--];
		}
		if(la!=i) tl[++tpl]=L,tli[tpl]=la;
		tl[++tpl]=0,tli[tpl]=i; seg.lx=seg.rx=i,seg.c=mid,seg.upd(1,1,idx);
		
		la=i;
		while(tr[tpr]>R&&tpr)
		{
			seg.lx=tri[tpr],seg.rx=la-1,seg.c=toy[R]-toy[tr[tpr]],seg.upd(1,1,idx);
			la=tri[tpr--];
		}
		if(la!=i) tr[++tpr]=R,tri[tpr]=la;
		tr[++tpr]=idy,tri[tpr]=i; seg.lx=seg.rx=i,seg.c=h-mid,seg.upd(1,1,idx);
		
		seg.lx=1,seg.rx=i; up(ans,seg.query(1,1,idx)+tox[i]);
	}
}

int main()
{
	//freopen("tmp.in","r",stdin);
	//freopen("tmp.out","w",stdout);
	
	scanf("%d%d%d",&w,&h,&n);
	for(int i=1;i<=n;i++) scanf("%d%d",&p[i].x,&p[i].y);
	trans();
	
	mid=w>>1; solve1();
	mid=h>>1; solve2();
	
	printf("%d\n",ans<<1);
	
	return 0;
}


Measured memory_bytes: 20864