#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <sstream>
#include <set>
#include <map>
#include <vector>
#include <list>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <string>
#include <stack>
#include <queue>
#include <bitset>     //UWAGA - w czasie kompilacji musi byc znany rozmiar wektora - nie mozna go zmienic
#include <cassert>
#include <iomanip>        //do setprecision
#include <ctime>
#include <complex>
using namespace std;

#define FOR(i,b,e) for(int i=(b);i<(e);++i)
#define FORQ(i,b,e) for(int i=(b);i<=(e);++i)
#define FORD(i,b,e) for(int i=(b)-1;i>=(e);--i)
#define REP(x, n) for(int x = 0; x < (n); ++x)

#define ST first
#define ND second
#define PB push_back
#define PF push_front
#define MP make_pair
#define LL long long
#define ULL unsigned LL
#define LD long double
#define pii pair<int,int>
#define pll pair<LL,LL>
#define vi vector<int>
#define vl vector<LL>
#define vii vector<vi>
#define vll vector<vl>

const double pi = 3.14159265358979323846264;
const int mod=1000000007;

//テストしてない！

//iの親:i/2
//iの子:2*i+0,2*i+1
//iの兄弟:i^1
//iの深さ//log_2 iの整数部分


struct segtree {//segtree seg=segtree(n);//n:データ数  0-index 基本半区間？
  int seg_unit=0;//単位元 minなら2e9など
  int segfunc(int a,int b){
    return max(a,b);
  }
    int N=1;
    vector<int> dat, sum;
    segtree(int n) {//n:データ数
        N = 1;
        while(N < n) N <<= 1;
        dat.assign(2*N-1,seg_unit);
        sum.assign(2*N-1,0);
    }
    void set_dat(int k, int a){
      k += N-1; // leaf
      dat[k] = a;
    }
    void set_func(){
      for(int i=N-1; i>0; --i) dat[i] = segfunc(dat[i*2+0], dat[i*2+1]);
    }
    void update(int k, int a) {//dat[k]=a
        k += N-1; // leaf
        dat[k] = a;
        while(k > 0) {
            k = (k - 1) / 2;
            dat[k] = segfunc(dat[k*2+1], dat[k*2+2]);
        }
    }
    void add(int a, int b, int x) { add(a,b,x,0,0,N); }
    int add(int a, int b, int x, int k, int l, int r) {//区間和
        if(b <= l || r <= a) return dat[k];
        if(a <= l && r <= b) {
            sum[k] += x;
            return dat[k] += x;
        }
        int m = (l+r)/2;
        return dat[k] = segfunc(add(a,b,x,2*k+1,l,m),add(a,b,x,2*k+2,m,r))+sum[k];
    }
    int query(int a, int b) { return query(a,b,0,0,N); }
    int query(int a, int b, int k, int l, int r) {
        if(b <= l || r <= a) return seg_unit;
        if(a <= l && r <= b) return dat[k];
        int m = (l+r)/2;
        return segfunc(query(a,b,2*k+1,l,m),query(a,b,2*k+2,m,r))+sum[k];
    }
};



int main(){
	int hh,ww,m;
    cin>>hh>>ww>>m;
    vi h(m),w(m);
    vii q(hh,vi());
    segtree seg=segtree(ww);
    FOR(i,0,ww){
        seg.set_dat(i,0);
    }
    seg.set_func();
    FOR(i,0,m){
        cin>>h[i]>>w[i];
        h[i]--;
        w[i]--;
        q[h[i]].PB(w[i]);
        seg.add(w[i],w[i]+1,1);
    }
    LL ans=0;
    FOR(i,0,hh){
        for(const auto x:q[i]){
            seg.add(x,x+1,-1);
        }
        ans=max(ans,(LL)(q[i].size()+seg.query(0,ww)));
        for(const auto x:q[i]){
            seg.add(x,x+1,1);
        }
        //cerr<<q[i].size()<<" "<<seg.query(0,ww)<<" "<<ans<<endl;
    }
    cout<<ans<<endl;

}


Measured memory_bytes: 30164