H,W,M=map(int,input().split())
#二次元リストではなく列行を一個のボムで消してくれるためそれぞれのリストを用意。
sumh = [0] * H
sumw = [0] * W
bomb=[]

for i in range(M):
    h,w=map(int,input().split())
    sumh[h-1]+=1
    sumw[w-1]+=1
    bomb.append((h,w))

#爆弾の個数の最大値とその最大値がいくつずつあるか(ch,cw)に保存。最大の列と最大の行のいずれかの組み合わせに置くことで爆破数を最大化できる。
maxh=max(sumh)
maxw=max(sumw)
ch=sumh.count(maxh)
cw=sumw.count(maxw)
#print(maxh,maxw,ch,cw)

#爆弾のある場所がH,Wの座標で両方共で最大個数の場所であった場合その数を加算
count=0
for h,w in bomb:
    if sumh[h-1]==maxh and sumw[w-1]==maxw:
        count+=1
#print(count)

#破壊できる数は、そのマスに爆破対象があるとき一つ減ってしまう。
if count==ch*cw:
    print(maxh+maxw-1)
else:
  print(maxh+maxw) H,W,M=map(int,input().split()) H map(int,input().split()) map int input().split() ().split () input split W M sumh = [0] * H sumh [0] * H [0] 0 H sumw = [0] * W sumw [0] * W [0] 0 W bomb=[] bomb [] for i in range(M):
    h,w=map(int,input().split())
    sumh[h-1]+=1
    sumw[w-1]+=1
    bomb.append((h,w))

#爆弾の個数の最大値とその最大値がいくつずつあるか(ch,cw)に保存。最大の列と最大の行のいずれかの組み合わせに置くことで爆破数を最大化できる。 i range(M) range M h,w=map(int,input().split()) h map(int,input().split()) map int input().split() ().split () input split w sumh[h-1]+=1 sumh[h-1] sumh h-1 h 1 1 sumw[w-1]+=1 sumw[w-1] sumw w-1 w 1 1 bomb.append((h,w)) bomb.append bomb append (h,w) h w maxh=max(sumh) maxh max(sumh) max sumh maxw=max(sumw) maxw max(sumw) max sumw ch=sumh.count(maxh) ch sumh.count(maxh) sumh.count sumh count maxh cw=sumw.count(maxw) cw sumw.count(maxw) sumw.count sumw count maxw count=0 count 0 for h,w in bomb:
    if sumh[h-1]==maxh and sumw[w-1]==maxw:
        count+=1
#print(count)

#破壊できる数は、そのマスに爆破対象があるとき一つ減ってしまう。 h w bomb if sumh[h-1]==maxh and sumw[w-1]==maxw:
        count+=1
#print(count)

#破壊できる数は、そのマスに爆破対象があるとき一つ減ってしまう。 sumh[h-1]==maxh and sumw[w-1]==maxw sumh[h-1]==maxh sumh[h-1] sumh h-1 h 1 maxh sumw[w-1]==maxw sumw[w-1] sumw w-1 w 1 maxw count+=1 count 1 if count==ch*cw:
    print(maxh+maxw-1)
else:
  print(maxh+maxw) count==ch*cw count ch*cw ch cw print(maxh+maxw-1) print maxh+maxw-1 maxh+maxw maxh maxw 1 print(maxh+maxw) print maxh+maxw maxh maxw count=0 0 count H,W,M=map(int,input().split()) map(int,input().split()) H sumh = [0] * H [0] * H sumh count+=1 1 count bomb=[] [] bomb M=map(int,input().split()) map(int,input().split()) M h,w=map(int,input().split()) map(int,input().split()) h w=map(int,input().split()) map(int,input().split()) w maxh=max(sumh) max(sumh) maxh sumw = [0] * W [0] * W sumw maxw=max(sumw) max(sumw) maxw cw=sumw.count(maxw) sumw.count(maxw) cw ch=sumh.count(maxh) sumh.count(maxh) ch W,M=map(int,input().split()) map(int,input().split()) W
H,W,M=map(int,input().split())
#二次元リストではなく列行を一個のボムで消してくれるためそれぞれのリストを用意。
sumh = [0] * H
sumw = [0] * W
bomb=[]

for i in range(M):
    h,w=map(int,input().split())
    sumh[h-1]+=1
    sumw[w-1]+=1
    bomb.append((h,w))

#爆弾の個数の最大値とその最大値がいくつずつあるか(ch,cw)に保存。最大の列と最大の行のいずれかの組み合わせに置くことで爆破数を最大化できる。
maxh=max(sumh)
maxw=max(sumw)
ch=sumh.count(maxh)
cw=sumw.count(maxw)
#print(maxh,maxw,ch,cw)

#爆弾のある場所がH,Wの座標で両方共で最大個数の場所であった場合その数を加算
count=0
for h,w in bomb:
    if sumh[h-1]==maxh and sumw[w-1]==maxw:
        count+=1
#print(count)

#破壊できる数は、そのマスに爆破対象があるとき一つ減ってしまう。
if count==ch*cw:
    print(maxh+maxw-1)
else:
  print(maxh+maxw)