import sys


H, W, M = map(int, input().split())
bomb =[]
for I in range(M):
    bom = tuple(map(lambda x: int(x) - 1, input().split()))
    bomb.append(bom)
X = [0] * H  # X:各行の爆破対象の個数
Y = [0] * W  # Y:各列の爆破対象の個数
for h, w in bomb:
    X[h] += 1
    Y[w] += 1
maxX = max(X)
maxY = max(Y)

R = [h for h, x in enumerate(X) if x == maxX]  # R:爆破対象の数が最大となる行の番号
C = [w for w, y in enumerate(Y) if y == maxY]  # C:爆破対象の数が最大となる列の番号

bomb = set(bomb)
for r in R:
    for c in C:
        if (r, c) not in bomb:
            # (r, c)に爆破対象が存在しないとき, maxX + maxY が答えとなることが確定するため, 
            # 即座に探索を終了する. これによりループの回数は最大でもM+1回となる.
            print(maxX + maxY)
            exit()
print(maxX + maxY - 1) import sys sys H, W, M = map(int, input().split()) H map(int, input().split()) map int input().split() ().split () input split W M bomb =[] bomb [] for I in range(M):
    bom = tuple(map(lambda x: int(x) - 1, input().split()))
    bomb.append(bom) I range(M) range M bom = tuple(map(lambda x: int(x) - 1, input().split())) bom tuple(map(lambda x: int(x) - 1, input().split())) tuple map(lambda x: int(x) - 1, input().split()) map lambda x: int(x) - 1 int(x) - 1 int(x) int x 1 x input().split() ().split () input split bomb.append(bom) bomb.append bomb append bom X = [0] * H X [0] * H [0] 0 H Y = [0] * W Y [0] * W [0] 0 W for h, w in bomb:
    X[h] += 1
    Y[w] += 1 h w bomb X[h] += 1 X[h] X h 1 Y[w] += 1 Y[w] Y w 1 maxX = max(X) maxX max(X) max X maxY = max(Y) maxY max(Y) max Y h for h, x in enumerate(X) if x == maxX for h, x in enumerate(X) if x == maxX h x enumerate(X) enumerate X x == maxX x maxX if x == maxX h R = [h for h, x in enumerate(X) if x == maxX] R [h for h, x in enumerate(X) if x == maxX] w for w, y in enumerate(Y) if y == maxY for w, y in enumerate(Y) if y == maxY w y enumerate(Y) enumerate Y y == maxY y maxY if y == maxY w C = [w for w, y in enumerate(Y) if y == maxY] C [w for w, y in enumerate(Y) if y == maxY] bomb = set(bomb) bomb set(bomb) set bomb for r in R:
    for c in C:
        if (r, c) not in bomb:
            # (r, c)に爆破対象が存在しないとき, maxX + maxY が答えとなることが確定するため, 
            # 即座に探索を終了する. これによりループの回数は最大でもM+1回となる.
            print(maxX + maxY)
            exit() r R for c in C:
        if (r, c) not in bomb:
            # (r, c)に爆破対象が存在しないとき, maxX + maxY が答えとなることが確定するため, 
            # 即座に探索を終了する. これによりループの回数は最大でもM+1回となる.
            print(maxX + maxY)
            exit() c C if (r, c) not in bomb:
            # (r, c)に爆破対象が存在しないとき, maxX + maxY が答えとなることが確定するため, 
            # 即座に探索を終了する. これによりループの回数は最大でもM+1回となる.
            print(maxX + maxY)
            exit() (r, c) not in bomb (r, c) r c bomb print(maxX + maxY) print maxX + maxY maxX maxY exit() exit print(maxX + maxY - 1) print maxX + maxY - 1 maxX + maxY maxX maxY 1 H, W, M = map(int, input().split()) map(int, input().split()) H R = [h for h, x in enumerate(X) if x == maxX] [h for h, x in enumerate(X) if x == maxX] R X = [0] * H [0] * H X C = [w for w, y in enumerate(Y) if y == maxY] [w for w, y in enumerate(Y) if y == maxY] C bom = tuple(map(lambda x: int(x) - 1, input().split())) tuple(map(lambda x: int(x) - 1, input().split())) bom W, M = map(int, input().split()) map(int, input().split()) W maxX = max(X) max(X) maxX M = map(int, input().split()) map(int, input().split()) M bomb = set(bomb) set(bomb) bomb Y = [0] * W [0] * W Y maxY = max(Y) max(Y) maxY bomb =[] [] bomb
import sys


H, W, M = map(int, input().split())
bomb =[]
for I in range(M):
    bom = tuple(map(lambda x: int(x) - 1, input().split()))
    bomb.append(bom)
X = [0] * H  # X:各行の爆破対象の個数
Y = [0] * W  # Y:各列の爆破対象の個数
for h, w in bomb:
    X[h] += 1
    Y[w] += 1
maxX = max(X)
maxY = max(Y)

R = [h for h, x in enumerate(X) if x == maxX]  # R:爆破対象の数が最大となる行の番号
C = [w for w, y in enumerate(Y) if y == maxY]  # C:爆破対象の数が最大となる列の番号

bomb = set(bomb)
for r in R:
    for c in C:
        if (r, c) not in bomb:
            # (r, c)に爆破対象が存在しないとき, maxX + maxY が答えとなることが確定するため, 
            # 即座に探索を終了する. これによりループの回数は最大でもM+1回となる.
            print(maxX + maxY)
            exit()
print(maxX + maxY - 1)