#include <iostream>
#include <bits/stdc++.h>
#define ll long long int
using namespace std;
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
// the little guy below helps me to create unordered set of vectors
// just declare it like this ---> unordered_set<vector<int>, VectorHash>>
// credits:: https://stackoverflow.com/users/2069064/barry
struct VectorHash
{
    size_t operator()(const std::vector<int> &v) const
    {
        std::hash<int> hasher;
        size_t seed = 0;
        for (int i : v)
        {
            seed ^= hasher(i) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
        }
        return seed;
    }
};
void __print(int x) { cerr << x; }
void __print(long x) { cerr << x; }
void __print(long long x) { cerr << x; }
void __print(unsigned x) { cerr << x; }
void __print(unsigned long x) { cerr << x; }
void __print(unsigned long long x) { cerr << x; }
void __print(float x) { cerr << x; }
void __print(double x) { cerr << x; }
void __print(long double x) { cerr << x; }
void __print(char x) { cerr << '\'' << x << '\''; }
void __print(const char *x) { cerr << '\"' << x << '\"'; }
void __print(const string &x) { cerr << '\"' << x << '\"'; }
void __print(bool x) { cerr << (x ? "true" : "false"); }

template <typename T, typename V>
void __print(const pair<T, V> &x)
{
    cerr << '{';
    __print(x.first);
    cerr << ',';
    __print(x.second);
    cerr << '}';
}
template <typename T>
void __print(const T &x)
{
    int f = 0;
    cerr << '{';
    for (auto &i : x)
        cerr << (f++ ? "," : ""), __print(i);
    cerr << "}";
}
void _print() { cerr << "]\n"; }
template <typename T, typename... V>
void _print(T t, V... v)
{
    __print(t);
    if (sizeof...(v))
        cerr << ", ";
    _print(v...);
}
#ifndef ONLINE_JUDGE
#define debug(x...)               \
    cerr << "[" << #x << "] = ["; \
    _print(x)
#else
#define debug(x...)
#endif

ll x[300002];
ll y[300002];

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    ll h, m, w,h1,w1,xmax,ymax,xkey,ykey;
    xmax = 0;
    ymax = 0;
    xkey = 0;
    ykey = 0;
    vector<pair<ll,ll>> cord;
    cin >> h >> w >> m;
    map<pair<ll, ll>, ll> mp;
    for (int i = 0; i < m; i++)
    {
        cin >> h1 >> w1;
        cord.push_back({h1, w1});
        mp[{h1, w1}] = 1;
        x[h1]++;
        if (x[h1]>xmax)
        {
            xmax = x[h1];
            xkey = h1;
        }
        y[w1]++;
        if (y[w1] > ymax)
        {
            ymax = y[w1];
            ykey = w1;
        }
    }
    vector<ll> xs, ys;
    for (int i = 1; i <= h; i++)
    {
        if (x[i]==xmax)
            xs.push_back(i);
        
    }
    for (int i = 1; i <= w; i++)
    {
        if (y[i]==ymax)
            ys.push_back(i);
    }
    bool f = 0;
    for (int i = 0; i < xs.size(); i++)
    {
        for (int j = 0; j < ys.size(); j++)
        {
            if (mp.find({xs[i],ys[j]})==mp.end())
            {
                xkey = xs[i];
                ykey = ys[j];
                f = 1;
                break;
            }
        }
        if (f)
            break;
    }
    set<pair<ll, ll>> fincords;
    for (auto i:cord)
    {
        if (i.first==xkey)
        {
            fincords.insert(i);
        }
        else if (i.second==ykey)
        {
            fincords.insert(i);
        }
    }
    cout << fincords.size() << '\n';
}

Measured memory_bytes: 50172