#include<bits/stdc++.h>
#define LL long long
using namespace std;
struct node {
LL x, y;
} a[5010];
int main() {
LL L, W;
scanf("%lld%lld", &L, &W);
int n;
scanf("%d", &n);
for(int i=1; i<=n; i++) {
scanf("%lld%lld", &a[i].x, &a[i].y);
}
a[++n]= {0, 0};
a[++n]= {0, W};
a[++n]= {L, 0};
a[++n]= {L, W};
sort(a+1, a+n+1, [](const node &a,const node &b) {
return (a.x==b.x)?a.y<b.y:a.x<b.x;
});
LL ans=0;
for(int i=1; i<=n; i++) {
LL l=0, h=W, v=L-a[i].x;
for(int j=i+1; j<=n; j++) {
if(a[j].y<=h&&a[j].y>=l||a[j].x==L) {
if(v*(h-l)<=ans) { //剪枝
break;
}
ans=max(ans, (h-l)*(a[j].x-a[i].x));
if(a[j].y==a[i].y) {
break;
}
if(a[j].y>a[i].y) {
h=min(h, a[j].y);
} else {
l=max(l, a[j].y);
}
}
}
l=0, h=W, v=a[i].x;
for(int j=i-1; j>=1; j--) {
if(a[j].y<=h&&a[j].y>=l||a[j].x==0) {
if(v*(h-l)<=ans) { //剪枝
break;
}
ans=max(ans, (h-l)*(a[i].x-a[j].x));
if(a[j].y==a[i].y) {
break;
}
if(a[j].y>a[i].y) {
h=min(h, a[j].y);
} else {
l=max(l, a[j].y);
}
}
}
}
sort(a+1, a+1+n, [](node &a, node &b) {
return a.y<b.y;
});
for(int i=1; i<n; i++) {
ans=max(ans, (a[i+1].y-a[i].y)*L);
}
printf("%lld\n", ans);
return 0;
}