Scanf.scanf "%d %d %d" (fun hh ww m ->
    let module S = Set.Make (struct type t = int let compare = compare end) in
    let module S2 = Set.Make (struct type t = int * int let compare = compare end) in
    let node_h  = Array.make hh S.empty in 
    let node_w  = Array.make ww S.empty in 
    let count_h = Array.make hh 0 in 
    let count_w = Array.make ww 0 in 
    let hw = Array.init m (fun _ -> Scanf.scanf " %d %d" (fun h w -> h - 1, w - 1)) in

    Array.iter (fun (h, w) ->
        node_h.(h)  <- S.add w node_h.(h);
        node_w.(w)  <- S.add h node_w.(w);
        count_h.(h) <- count_h.(h) + 1;
        count_w.(w) <- count_w.(w) + 1;
    ) hw;
    let rec loop_h i set_h =
        if i = hh then set_h else
            loop_h (i + 1) (S2.add (count_h.(i), i) set_h)
    in
    let rec loop_w i set_w =
        if i = ww then set_w else
            loop_w (i + 1) (S2.add (count_w.(i), i) set_w)
    in
    let set_h = loop_h 0 S2.empty in
    let set_w = loop_w 0 S2.empty in

    let ((mch, mih) as mxh) = S2.max_elt set_h in
    let ((mcw, miw) as mxw) = S2.max_elt set_w in

    let rec loop_w w acc =
        if w = ww then acc else
            let cur = if S.mem w node_h.(mih) then mch + count_w.(w) - 1 else mch + count_w.(w) in
            loop_w (w + 1) (max acc cur)
    in
    let acc = loop_w 0 0 in
    let rec loop_h h acc =
        if h = hh then acc else
            let cur = if S.mem h node_w.(miw) then mcw + count_h.(h) - 1 else mcw + count_h.(h) in
            loop_h (h + 1) (max acc cur)
    in
    let acc = loop_h 0 acc in
    Printf.printf "%d\n" acc
)