Problem p02580 (C++)

Buggy submission (status: Time Limit Exceeded):
// I'll always miss you like a darling.
#include <bits/stdc++.h>
using namespace std;

#define LL long long
#define LD long double
#define ull unsigned long long
#define x first
#define y second
#define pb push_back
#define pf push_front
#define mp make_pair
#define Pair pair<int, int>
#define pLL pair<LL, LL>
#define pii pair<double, double>
#define LOWBIT(x) x & (-x)

#define rep(i, a, b) for (int i = a; i <= b; i++)
#define REP(i, a, b) for (int i = a; i >= b; i--)

const int INF = 2e9;
const LL LINF = 2e16;
const int magic = 348;
const int MOD = 1e9 + 7;
const double eps = 1e-10;
const double pi = acos(-1);

struct fastio {
  static const int S = 1e7;
  char rbuf[S + 48], wbuf[S + 48];
  int rpos, wpos, len;
  fastio() { rpos = len = wpos = 0; }
  inline char Getchar() {
    if (rpos == len)
      rpos = 0, len = fread(rbuf, 1, S, stdin);
    if (!len)
      return EOF;
    return rbuf[rpos++];
  }
  template <class T> inline void Get(T &x) {
    char ch;
    bool f;
    T res;
    while (!isdigit(ch = Getchar()) && ch != '-') {
    }
    if (ch == '-')
      f = false, res = 0;
    else
      f = true, res = ch - '0';
    while (isdigit(ch = Getchar()))
      res = res * 10 + ch - '0';
    x = (f ? res : -res);
  }
  inline void getstring(char *s) {
    char ch;
    while ((ch = Getchar()) <= 32) {
    }
    for (; ch > 32; ch = Getchar())
      *s++ = ch;
    *s = '\0';
  }
  inline void flush() {
    fwrite(wbuf, 1, wpos, stdout);
    fflush(stdout);
    wpos = 0;
  }
  inline void Writechar(char ch) {
    if (wpos == S)
      flush();
    wbuf[wpos++] = ch;
  }
  template <class T> inline void Print(T x, char ch) {
    char s[20];
    int pt = 0;
    if (x == 0)
      s[++pt] = '0';
    else {
      if (x < 0)
        Writechar('-'), x = -x;
      while (x)
        s[++pt] = '0' + x % 10, x /= 10;
    }
    while (pt)
      Writechar(s[pt--]);
    Writechar(ch);
  }
  inline void printstring(char *s) {
    int pt = 1;
    while (s[pt] != '\0')
      Writechar(s[pt++]);
  }
} io;

template <typename T> inline void check_max(T &x, T cmp) { x = max(x, cmp); }
template <typename T> inline void check_min(T &x, T cmp) { x = min(x, cmp); }
template <typename T> inline T myabs(T x) { return x >= 0 ? x : -x; }
template <typename T> inline T gcd(T x, T y) {
  return y == 0 ? x : gcd(y, x % y);
}
inline int add(int x) {
  if (x >= MOD)
    x -= MOD;
  return x;
}
inline int add(int x, int MO) {
  if (x >= MO)
    x -= MO;
  return x;
}
inline int sub(int x) {
  if (x < 0)
    x += MOD;
  return x;
}
inline int sub(int x, int MO) {
  if (x < 0)
    x += MO;
  return x;
}
inline void Add(int &x, int y) { x = add(x + y); }
inline void Add(int &x, int y, int MO) { x = add(x + y, MO); }
inline void Sub(int &x, int y) { x = sub(x - y); }
inline void Sub(int &x, int y, int MO) { x = sub(x - y, MO); }
template <typename T> inline int quick_pow(int x, T y) {
  int res = 1;
  while (y) {
    if (y & 1)
      res = 1ll * res * x % MOD;
    x = 1ll * x * x % MOD;
    y >>= 1;
  }
  return res;
}
template <typename T> inline int quick_pow(int x, T y, int MO) {
  int res = 1;
  while (y) {
    if (y & 1)
      res = 1ll * res * x % MO;
    x = 1ll * x * x % MO;
    y >>= 1;
  }
  return res;
}

const int MAXN = 3e5;

int r, c, n;

struct node {
  int x, y;
} a[MAXN + 48];

inline bool cmp_x(node x, node y) { return x.x < y.x; }
inline bool cmp_y(node x, node y) { return x.y < y.y; }

set<int> candidate;
int tot;

int main() {
#ifndef ONLINE_JUDGE
  double TIME = clock();
  freopen("a.in", "r", stdin);
  freopen("a.out", "w", stdout);
  cerr << "Running..." << endl;
#endif
  scanf("%d%d%d", &r, &c, &n);
  rep(i, 1, n) scanf("%d%d", &a[i].x, &a[i].y);
  int max1 = 0, max2 = 0;
  sort(a + 1, a + n + 1, cmp_y);
  rep(i, 1, n) {
    int j = i, cur = a[i].y;
    while (j <= n && a[j].y == cur)
      j++;
    j--;
    if (j - i + 1 > max2) {
      max2 = j - i + 1;
      candidate.clear();
      candidate.insert(cur);
    } else if (j - i + 1 == max2)
      candidate.insert(cur);
    i = j;
  }
  tot = int(candidate.size());
  sort(a + 1, a + n + 1, cmp_x);
  rep(i, 1, n) {
    int j = i, cur = a[i].x;
    while (j <= n && a[j].x == cur)
      j++;
    j--;
    check_max(max1, j - i + 1);
    i = j;
  }
  bool f = false;
  rep(i, 1, n) {
    int j = i, cur = a[i].x;
    while (j <= n && a[j].x == cur)
      j++;
    j--;
    if (j - i + 1 == max1) {
      int cnt = 0;
      rep(k, i, j) if (candidate.find(a[k].y) != candidate.end()) cnt++;
      if (cnt < tot)
        f = true;
    }
  }
  int ans = max1 + max2;
  if (!f)
    ans--;
  printf("%d\n", ans);
#ifndef ONLINE_JUDGE
  cerr << "Exec Time: " << (clock() - TIME) / CLOCKS_PER_SEC << endl;
#endif
  return 0;
}

Fixed submission:
// I'll always miss you like a darling.
#include <bits/stdc++.h>
using namespace std;

#define LL long long
#define LD long double
#define ull unsigned long long
#define x first
#define y second
#define pb push_back
#define pf push_front
#define mp make_pair
#define Pair pair<int, int>
#define pLL pair<LL, LL>
#define pii pair<double, double>
#define LOWBIT(x) x & (-x)

#define rep(i, a, b) for (int i = a; i <= b; i++)
#define REP(i, a, b) for (int i = a; i >= b; i--)

const int INF = 2e9;
const LL LINF = 2e16;
const int magic = 348;
const int MOD = 1e9 + 7;
const double eps = 1e-10;
const double pi = acos(-1);

struct fastio {
  static const int S = 1e7;
  char rbuf[S + 48], wbuf[S + 48];
  int rpos, wpos, len;
  fastio() { rpos = len = wpos = 0; }
  inline char Getchar() {
    if (rpos == len)
      rpos = 0, len = fread(rbuf, 1, S, stdin);
    if (!len)
      return EOF;
    return rbuf[rpos++];
  }
  template <class T> inline void Get(T &x) {
    char ch;
    bool f;
    T res;
    while (!isdigit(ch = Getchar()) && ch != '-') {
    }
    if (ch == '-')
      f = false, res = 0;
    else
      f = true, res = ch - '0';
    while (isdigit(ch = Getchar()))
      res = res * 10 + ch - '0';
    x = (f ? res : -res);
  }
  inline void getstring(char *s) {
    char ch;
    while ((ch = Getchar()) <= 32) {
    }
    for (; ch > 32; ch = Getchar())
      *s++ = ch;
    *s = '\0';
  }
  inline void flush() {
    fwrite(wbuf, 1, wpos, stdout);
    fflush(stdout);
    wpos = 0;
  }
  inline void Writechar(char ch) {
    if (wpos == S)
      flush();
    wbuf[wpos++] = ch;
  }
  template <class T> inline void Print(T x, char ch) {
    char s[20];
    int pt = 0;
    if (x == 0)
      s[++pt] = '0';
    else {
      if (x < 0)
        Writechar('-'), x = -x;
      while (x)
        s[++pt] = '0' + x % 10, x /= 10;
    }
    while (pt)
      Writechar(s[pt--]);
    Writechar(ch);
  }
  inline void printstring(char *s) {
    int pt = 1;
    while (s[pt] != '\0')
      Writechar(s[pt++]);
  }
} io;

template <typename T> inline void check_max(T &x, T cmp) { x = max(x, cmp); }
template <typename T> inline void check_min(T &x, T cmp) { x = min(x, cmp); }
template <typename T> inline T myabs(T x) { return x >= 0 ? x : -x; }
template <typename T> inline T gcd(T x, T y) {
  return y == 0 ? x : gcd(y, x % y);
}
inline int add(int x) {
  if (x >= MOD)
    x -= MOD;
  return x;
}
inline int add(int x, int MO) {
  if (x >= MO)
    x -= MO;
  return x;
}
inline int sub(int x) {
  if (x < 0)
    x += MOD;
  return x;
}
inline int sub(int x, int MO) {
  if (x < 0)
    x += MO;
  return x;
}
inline void Add(int &x, int y) { x = add(x + y); }
inline void Add(int &x, int y, int MO) { x = add(x + y, MO); }
inline void Sub(int &x, int y) { x = sub(x - y); }
inline void Sub(int &x, int y, int MO) { x = sub(x - y, MO); }
template <typename T> inline int quick_pow(int x, T y) {
  int res = 1;
  while (y) {
    if (y & 1)
      res = 1ll * res * x % MOD;
    x = 1ll * x * x % MOD;
    y >>= 1;
  }
  return res;
}
template <typename T> inline int quick_pow(int x, T y, int MO) {
  int res = 1;
  while (y) {
    if (y & 1)
      res = 1ll * res * x % MO;
    x = 1ll * x * x % MO;
    y >>= 1;
  }
  return res;
}

const int MAXN = 3e5;

int r, c, n;

struct node {
  int x, y;
} a[MAXN + 48];

inline bool cmp_x(node x, node y) { return x.x < y.x; }
inline bool cmp_y(node x, node y) { return x.y < y.y; }

set<int> candidate;
int tot;

int main() {
#ifndef ONLINE_JUDGE
  double TIME = clock();
  freopen("a.in", "r", stdin);
  freopen("a.out", "w", stdout);
  cerr << "Running..." << endl;
#endif
  scanf("%d%d%d", &r, &c, &n);
  rep(i, 1, n) scanf("%d%d", &a[i].x, &a[i].y);
  int max1 = 0, max2 = 0;
  sort(a + 1, a + n + 1, cmp_y);
  rep(i, 1, n) {
    int j = i, cur = a[i].y;
    while (j <= n && a[j].y == cur)
      j++;
    j--;
    if (j - i + 1 > max2) {
      max2 = j - i + 1;
      candidate.clear();
      candidate.insert(cur);
    } else if (j - i + 1 == max2)
      candidate.insert(cur);
    i = j;
  }
  tot = int(candidate.size());
  sort(a + 1, a + n + 1, cmp_x);
  rep(i, 1, n) {
    int j = i, cur = a[i].x;
    while (j <= n && a[j].x == cur)
      j++;
    j--;
    check_max(max1, j - i + 1);
    i = j;
  }
  bool f = false;
  rep(i, 1, n) {
    int j = i, cur = a[i].x;
    while (j <= n && a[j].x == cur)
      j++;
    j--;
    if (j - i + 1 == max1) {
      int cnt = 0;
      rep(k, i, j) if (candidate.find(a[k].y) != candidate.end()) cnt++;
      if (cnt < tot)
        f = true;
    }
    i = j;
  }
  int ans = max1 + max2;
  if (!f)
    ans--;
  printf("%d\n", ans);
#ifndef ONLINE_JUDGE
  cerr << "Exec Time: " << (clock() - TIME) / CLOCKS_PER_SEC << endl;
#endif
  return 0;
}