#include <bits/stdc++.h>
using namespace std;

#define Darr(x)           \
    cerr << #x << " = ";  \
    for (auto i : x)      \
        cerr << i << " "; \
    cerr << "\n";
#define ar array
#define pr pair
#define vt vector
#define pb push_back
#define all(c) (c).begin(), (c).end()
#define sz(x) (int)(x).size()

#define F_OR(i, a, b, s) for (int i = (a); (s) > 0 ? i < (b) : i > (b); i += (s))
#define F_OR1(e) F_OR(i, 0, e, 1)
#define F_OR2(i, e) F_OR(i, 0, e, 1)
#define F_OR3(i, b, e) F_OR(i, b, e, 1)
#define F_OR4(i, b, e, s) F_OR(i, b, e, s)
#define GET5(a, b, c, d, e, ...) e
#define F_ORC(...) GET5(__VA_ARGS__, F_OR4, F_OR3, F_OR2, F_OR1)
#define FOR(...)       \
    F_ORC(__VA_ARGS__) \
    (__VA_ARGS__)
#define EACH(x, a) for (auto &x : a)

template <class A>
void read(vt<A> &v);
template <class A, size_t S>
void read(ar<A, S> &a);
template <class T>
void read(T &x)
{
    cin >> x;
}
void read(double &d)
{
    string t;
    read(t);
    d = stod(t);
}
void read(long double &d)
{
    string t;
    read(t);
    d = stold(t);
}
template <class H, class... T>
void read(H &h, T &... t)
{
    read(h);
    read(t...);
}
template <class A>
void read(vt<A> &x)
{
    EACH(a, x)
    read(a);
}
template <class A, size_t S>
void read(array<A, S> &x)
{
    EACH(a, x)
    read(a);
}
string to_string(char c)
{
    return string(1, c);
}
string to_string(bool b)
{
    return b ? "yes" : "no";
}
string to_string(const char *s)
{
    return string(s);
}
string to_string(string s)
{
    return s;
}
string to_string(vt<bool> v)
{
    string res;
    FOR(sz(v))
    res += char('0' + v[i]);
    return res;
}

template <size_t S>
string to_string(bitset<S> b)
{
    string res;
    FOR(S)
    res += char('0' + b[i]);
    return res;
}
template <class T>
string to_string(T v)
{
    bool f = 1;
    string res;
    EACH(x, v)
    {
        if (!f)
            res += ' ';
        f = 0;
        res += to_string(x);
    }
    return res;
}

template <class A>
void write(A x)
{
    cout << to_string(x) << " ";
}
template <class H, class... T>
void write(const H &h, const T &... t)
{
    write(h);
    write(t...);
}
void print()
{
    cout << ("\n");
}
template <class H, class... T>
void print(const H &h, const T &... t)
{
    write(h);
    if (sizeof...(t))
        write(' ');
    print(t...);
}

void deb() { cerr << endl; }

template <typename Head, typename... Tail>
void deb(Head H, Tail... T)
{
    cerr << to_string(H) << " ";
    deb(T...);
}

using ll = long long;

pair<const int, const int> dxdy[4] = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}};

// Let's Code

const int MxN = 1e3 + 5;

int solve()
{
    map<int, int> fx, fy;
    int h, w, m;
    read(h, w, m);
    set<pair<int, int>> s;
    FOR(m)
    {
        int x, y;
        read(x, y);
        s.insert({x, y});
        fx[x]++;
        fy[y]++;
    }
    int mx_x=0,mx_y=0;
    for (auto [x, y] : fx)
        mx_x = max(mx_x, y);
        
    for (auto [x, y] : fy)
        mx_y = max(mx_y, y);
        
    vt<int> xx, yy;
    for (auto [x, y] : fx)
        if (y == mx_x)
            xx.emplace_back(x);
    for (auto [x, y] : fy)
        if (y == mx_y)
            yy.emplace_back(x);
    
    for (auto x : xx)
    {
        for (auto y : yy)
        {
            if (s.find({x, y}) == s.end())
            {
                return cout << mx_x + mx_y, 0;
            }
        }
    }
    cout << mx_x + mx_y - 1;
    return 0;
}
//

int32_t main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    // /freopen("output.txt", "w", stdout);
#endif

    int tc = 1;

    //UNCOMMENT FOR TEST CASE
    //cin >> tc;
    FOR(tc)
    {
        //write("Case #", i+1, ": ");
        solve();
    }
}


Measured memory_bytes: 49592