#include <bits/stdc++.h>
 
const double pi = 3.141592653589793238462643383279;
using namespace std;

//typedef
//------------------------------------------
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<string> VS;
typedef pair<int, int> PII;
typedef pair<long long, long long> PLL;
typedef pair<int, PII> TIII;
typedef long long LL;
typedef unsigned long long ULL;
typedef vector<LL> VLL;
typedef vector<VLL> VVLL;
 
 
//container util
//------------------------------------------
#define ALL(a)  (a).begin(),(a).end()
#define RALL(a) (a).rbegin(), (a).rend()
#define PB push_back
#define MP make_pair
#define SQ(a) ((a)*(a))
#define EACH(i,c) for(typeof((c).begin()) i=(c).begin(); i!=(c).end(); ++i)
#define EXIST(s,e) ((s).find(e)!=(s).end())
#define SORT(c) sort((c).begin(),(c).end())
 
 
//repetition
//------------------------------------------
#define FOR(i,s,n) for(int i=s;i<(int)n;++i)
#define REP(i,n) FOR(i,0,n)
#define MOD 1000000007
 
 
#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define trav(a, x) for(auto& a : x)
#define all(x) x.begin(), x.end()
#define sz(x) (int)(x).size()
 
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
 
#define chmin(x,y) x=min(x,y)
#define chmax(x,y) x=max(x,y)
const long double EPS = 1e-6, PI = acos((long double)-1);

//ここから編集
class UnionFind {
public:
    vector <int> par; 
    vector <int> siz; 

    UnionFind(int sz_): par(sz_), siz(sz_, 1) {
        for (ll i = 0; i < sz_; ++i) par[i] = i;
    }
    void init(int sz_) {
        par.resize(sz_);
        siz.assign(sz_, 1LL);
        for (ll i = 0; i < sz_; ++i) par[i] = i;
    }
 
    int root(int x) { 
        while (par[x] != x) {
            x = par[x] = par[par[x]];
        }
        return x;
    }
 
    bool merge(int x, int y) {
        x = root(x);
        y = root(y);
        if (x == y) return false;
        if (siz[x] < siz[y]) swap(x, y);
        siz[x] += siz[y];
        par[y] = x;
        return true;
    }
 
    bool issame(int x, int y) { 
        return root(x) == root(y);
    }
 
    int size(int x) { 
        return siz[root(x)];
    }
};

vector<vector<int>> hh(300010), ww(300010);

int cnt = 0;
bool visited[301010];
vector<int> h(301010), w(301010);



int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(4);
  
  ll H, W, M;
  cin  >> H >> W >> M;

  unordered_map<ll, bool> mp;
  REP(i,M){
    ll a, b; cin >> a >> b;
    a--; b--;
    h[i] = a, w[i] = b;
    mp[a*W + b] = true;

    hh[a].push_back(i);
    ww[b].push_back(i);
  }

  int ans = 0;

  int mx = 0;
  for(int i=0; i<H; i++){
    mx = max(mx, (int)hh[i].size());
  }

  vector<ll> t;
  for(int i=0; i<H; i++){
    if(hh[i].size() == mx){
      t.push_back(i);
    }
  }

  int mx2 = 0;
  for(int i=0; i<W; i++){
    mx2 = max(mx2, (int)ww[i].size());
  }

  vector<ll> t2;
  for(int i=0; i<W; i++){
    if(mx2 == ww[i].size()) t2.push_back(i);
  }

  bool ok = false;
  ans = mx+mx2-1;

  for(int i=0; i<t.size(); i++){
    for(int j=0; j<t2.size(); j++){
      if(mp.find(t[i]*W + t2[j]) == mp.end()){
        
        ans = mx+mx2;
        ok = true;
        break;
      }
    }
    if(ok) break;
  }
  cout << ans << endl;

  
  
  

  return 0;
}

Measured memory_bytes: 60288