H, W, M = map(int, input().split())

#方針
# 1,基本的には、行和の最大と列和の最大の和が答えとなる
# 2,例外として、行和の最大を与える行と、列和の最大を与える列との交差点が、
#   全て爆破対象で埋まっている場合(飽和)、重複分の1を引く必要がある。

A = [0 for _ in range(H)] # 各行の爆破対象の個数 (行和)
B = [0 for _ in range(W)] # 各列の爆破対象の個数 (列和)
C = set() # 爆破対象の位置の集合

for _ in range(M): #入力処理
  h, w = map(int, input().split())
  A[h-1] += 1
  B[w-1] += 1
  C.add((h-1, w-1))

# 処理1, 行和の最大と列和の最大の和を求める
d = max(A) # 行和の最大
e = max(B) # 列和の最大
ans = d+e # 爆破できる最大の個数(仮)

# 処理2, 飽和を検出する
#  方針: 「交差点個数 == 交差点上の対象物個数」 なら飽和とする

F = set() # 最大を与える行の集合
G = set() # 最大を与える列の集合
for h in range(H):
  if A[h] == d:
    F.add(h)
for w in range(W):
  if B[w] == e:
    G.add(w)
  
spot = len(F)*len(G) # 最大を与える列と、最大を与える行の交差点の個数
bm_on_spot = 0 # 上記交差点の上にある対象物の個数 (以下のループ中でカウントする)
for c in C:
  if c[0] in F and c[1] in G: # 対象物が交差点上にある場合,カウント+1
    bm_on_spot += 1
    
if bm_on_spot == spot: #「交差点個数 == 交差点上の対象物個数」 なら飽和とする
  ans -= 1

print(ans) H, W, M = map(int, input().split()) H map(int, input().split()) map int input().split() ().split () input split W M 0 for _ in range(H) for _ in range(H) _ range(H) range H for _ in range(H) 0 A = [0 for _ in range(H)] A [0 for _ in range(H)] 0 for _ in range(W) for _ in range(W) _ range(W) range W for _ in range(W) 0 B = [0 for _ in range(W)] B [0 for _ in range(W)] C = set() C set() set for _ in range(M): #入力処理
  h, w = map(int, input().split())
  A[h-1] += 1
  B[w-1] += 1
  C.add((h-1, w-1))

# 処理1, 行和の最大と列和の最大の和を求める _ range(M) range M h, w = map(int, input().split()) h map(int, input().split()) map int input().split() ().split () input split w A[h-1] += 1 A[h-1] A h-1 h 1 1 B[w-1] += 1 B[w-1] B w-1 w 1 1 C.add((h-1, w-1)) C.add C add (h-1, w-1) h-1 h 1 w-1 w 1 d = max(A) d max(A) max A e = max(B) e max(B) max B ans = d+e ans d+e d e F = set() F set() set G = set() G set() set for h in range(H):
  if A[h] == d:
    F.add(h) h range(H) range H if A[h] == d:
    F.add(h) A[h] == d A[h] A h d F.add(h) F.add F add h for w in range(W):
  if B[w] == e:
    G.add(w)
   w range(W) range W if B[w] == e:
    G.add(w)
   B[w] == e B[w] B w e G.add(w) G.add G add w spot = len(F)*len(G) spot len(F)*len(G) len(F) len F len(G) len G bm_on_spot = 0 bm_on_spot 0 for c in C:
  if c[0] in F and c[1] in G: # 対象物が交差点上にある場合,カウント+1
    bm_on_spot += 1
     c C if c[0] in F and c[1] in G: # 対象物が交差点上にある場合,カウント+1
    bm_on_spot += 1
     c[0] in F and c[1] in G c[0] in F c[0] c 0 F c[1] in G c[1] c 1 G bm_on_spot += 1 bm_on_spot 1 if bm_on_spot == spot: #「交差点個数 == 交差点上の対象物個数」 なら飽和とする
  ans -= 1 bm_on_spot == spot bm_on_spot spot ans -= 1 ans 1 print(ans) print ans H, W, M = map(int, input().split()) map(int, input().split()) H ans = d+e d+e ans spot = len(F)*len(G) len(F)*len(G) spot bm_on_spot += 1 1 bm_on_spot ans -= 1 1 ans A = [0 for _ in range(H)] [0 for _ in range(H)] A w = map(int, input().split()) map(int, input().split()) w C = set() set() C e = max(B) max(B) e B = [0 for _ in range(W)] [0 for _ in range(W)] B W, M = map(int, input().split()) map(int, input().split()) W d = max(A) max(A) d bm_on_spot = 0 0 bm_on_spot G = set() set() G M = map(int, input().split()) map(int, input().split()) M h, w = map(int, input().split()) map(int, input().split()) h F = set() set() F
H, W, M = map(int, input().split())

#方針
# 1,基本的には、行和の最大と列和の最大の和が答えとなる
# 2,例外として、行和の最大を与える行と、列和の最大を与える列との交差点が、
#   全て爆破対象で埋まっている場合(飽和)、重複分の1を引く必要がある。

A = [0 for _ in range(H)] # 各行の爆破対象の個数 (行和)
B = [0 for _ in range(W)] # 各列の爆破対象の個数 (列和)
C = set() # 爆破対象の位置の集合

for _ in range(M): #入力処理
  h, w = map(int, input().split())
  A[h-1] += 1
  B[w-1] += 1
  C.add((h-1, w-1))

# 処理1, 行和の最大と列和の最大の和を求める
d = max(A) # 行和の最大
e = max(B) # 列和の最大
ans = d+e # 爆破できる最大の個数(仮)

# 処理2, 飽和を検出する
#  方針: 「交差点個数 == 交差点上の対象物個数」 なら飽和とする

F = set() # 最大を与える行の集合
G = set() # 最大を与える列の集合
for h in range(H):
  if A[h] == d:
    F.add(h)
for w in range(W):
  if B[w] == e:
    G.add(w)
  
spot = len(F)*len(G) # 最大を与える列と、最大を与える行の交差点の個数
bm_on_spot = 0 # 上記交差点の上にある対象物の個数 (以下のループ中でカウントする)
for c in C:
  if c[0] in F and c[1] in G: # 対象物が交差点上にある場合,カウント+1
    bm_on_spot += 1
    
if bm_on_spot == spot: #「交差点個数 == 交差点上の対象物個数」 なら飽和とする
  ans -= 1

print(ans)