#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define LL long long
using namespace std;
const int N=5005;
int read()
{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
int r,c,n,frog[N][N],vis[N][N],res=2;
struct Node{int x,y;}dot[N];
bool cmp(Node o1,Node o2){return (o1.x==o2.x)?(o1.y<o2.y):(o1.x<o2.x);}
bool in(int x,int y){return x>=1&&x<=r&&y>=1&&y<=c;}
int main()
{
r=read(),c=read(),n=read();
for(int i=1;i<=n;i++)
{
dot[i].x=read(),dot[i].y=read();
frog[dot[i].x][dot[i].y]=1;
}
sort(dot+1,dot+1+n,cmp);
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(vis[dot[j].x][dot[j].y]==i)continue;
vis[dot[j].x][dot[j].y]=i;
int dx=dot[j].x-dot[i].x,dy=dot[j].y-dot[i].y;
int tx=dot[i].x-dx,ty=dot[i].y-dy;
if(in(tx,ty))continue;
if(!in(dot[i].x+(res-1)*dx,dot[i].y+(res-1)*dy))continue;
tx=dot[j].x,ty=dot[j].y;
int num=1;
while(in(tx,ty))
{
num++;
if(!frog[tx][ty]){num=0;break;}
tx+=dx,ty+=dy;
}
res=max(res,num);
}
}
printf("%d\n",res<3?0:res);
return 0;
}