Problem p02580 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>

#define maxn 30001
#define LL long long
#define inf 10000000000
#define mod 1000000007
#define pi 3.14159265359
using namespace std;
int dx[24] = {1, 0, -1, 0, 2,  0,  -2, 0,  -1, -1, -2, -2,
              1, 1, 2,  2, -1, -1, -2, -2, 1,  1,  2,  2};
int dy[24] = {0,  1,  0,  -1, 0, 2, 0, -2, -1, -2, -1, -2,
              -1, -2, -1, -2, 1, 2, 1, 2,  1,  2,  1,  2};

LL n, m, k;
int arr[maxn];
int arr2[maxn];
// int visit[maxn][maxn];
// int cache[maxn];
// int c[maxn];
// int g[maxn];
// int dfsnum = 0;
// vector<vector<int>>rvi;
// vector<vector<int>>scc;
// vector<pair<int, int>>ett;
// stack<int>st;
// bool flg = 1;
// LL s, d;
//
// int findp(int a) {
//	if (a == c[a])return a;
//	return c[a] = findp(c[a]);
// }
// void unionp(int a, int b) {
//	a = findp(a);
//	b = findp(b);
//
//	if (g[a] < g[b])swap(a, b);
//	c[b] = a;
//	g[a] += g[b];
//	g[b] = 1;
//
// }
// LL power(LL x, LL y) {
//	LL ret = 1;
//	while (y > 0) {
//		if (y % 2) {
//			ret *= x;
//			ret %= mod;
//		}
//		x *= x;
//		x %= mod;
//		y /= 2;
//	}
//	return ret;
// }
// void dfs2(int v) {
//	cache[v] = 1;
//	scc.back().push_back(v);
//	for (int nv : rvi[v]) {
//		if (cache[nv])continue;
//		dfs2(nv);
//	}
//
// }
// LL fac(LL n) {
//	if (n == 1) return 1;
//	return (n * fac(n - 1) - power(2,n-1) )%mod;
// }
// int fac2(LL n) {
//	LL res, i;
//	if (n == 1)return n;
//	res = n;
//	for (int i = n - 1; i > 0; --i) {
//		res *= i;
//		res %= mod;
//	}
//	return res;
// }

LL gcd(LL a, LL b) {
  while (b != 0) {
    LL r = a % b;
    a = b;
    b = r;
  }
  return a;
}
vector<LL> vi;
vector<LL> vi2;
vector<vector<int>> graph;

int main() {
  std::ios_base::sync_with_stdio(false);
  cin.tie(NULL);

  // int t;   cin >> t; cin.ignore();
  int t = 1;
  for (int test_case = 0; test_case < t; ++test_case) {
    int flg = 1;
    LL ans1 = 0, ans2 = 0;
    string ans[2] = {"No", "Yes"};
    cin >> n >> m >> k;
    set<int> s[maxn];
    for (int i = 0; i < k; ++i) {
      LL y, x;
      cin >> y >> x;

      arr[y]++;
      arr2[x]++;
      s[y].insert(x);
    }
    int mx1 = arr[1];
    int mx2 = arr2[1];
    for (int i = 2; i <= n; ++i)
      mx1 = mx1 < arr[i] ? arr[i] : mx1;
    for (int i = 2; i <= m; ++i)
      mx2 = mx2 < arr2[i] ? arr2[i] : mx2;

    for (int i = 1; i <= n; ++i)
      if (arr[i] == mx1)
        vi.push_back(i);
    for (int i = 1; i <= m; ++i)
      if (arr2[i] == mx2)
        vi2.push_back(i);

    for (int i = 0; i < vi.size(); ++i) {
      for (int j = 0; j < vi2.size(); ++j) {
        if (s[vi[i]].find(vi2[j]) == s[vi[i]].end()) {
          cout << mx1 + mx2;
          flg = 0;
          break;
        }
      }
      if (!flg)
        break;
    }
    if (flg)
      cout << mx1 + mx2 - 1;
    cout << '\n';
  }
  return 0;
}


Fixed submission:
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>

#define maxn 300010
#define LL long long
#define inf 10000000000
#define mod 1000000007
#define pi 3.14159265359
using namespace std;
int dx[24] = {1, 0, -1, 0, 2,  0,  -2, 0,  -1, -1, -2, -2,
              1, 1, 2,  2, -1, -1, -2, -2, 1,  1,  2,  2};
int dy[24] = {0,  1,  0,  -1, 0, 2, 0, -2, -1, -2, -1, -2,
              -1, -2, -1, -2, 1, 2, 1, 2,  1,  2,  1,  2};

LL n, m, k;
int arr[maxn];
int arr2[maxn];
// int visit[maxn][maxn];
// int cache[maxn];
// int c[maxn];
// int g[maxn];
// int dfsnum = 0;
// vector<vector<int>>rvi;
// vector<vector<int>>scc;
// vector<pair<int, int>>ett;
// stack<int>st;
// bool flg = 1;
// LL s, d;
//
// int findp(int a) {
//	if (a == c[a])return a;
//	return c[a] = findp(c[a]);
// }
// void unionp(int a, int b) {
//	a = findp(a);
//	b = findp(b);
//
//	if (g[a] < g[b])swap(a, b);
//	c[b] = a;
//	g[a] += g[b];
//	g[b] = 1;
//
// }
// LL power(LL x, LL y) {
//	LL ret = 1;
//	while (y > 0) {
//		if (y % 2) {
//			ret *= x;
//			ret %= mod;
//		}
//		x *= x;
//		x %= mod;
//		y /= 2;
//	}
//	return ret;
// }
// void dfs2(int v) {
//	cache[v] = 1;
//	scc.back().push_back(v);
//	for (int nv : rvi[v]) {
//		if (cache[nv])continue;
//		dfs2(nv);
//	}
//
// }
// LL fac(LL n) {
//	if (n == 1) return 1;
//	return (n * fac(n - 1) - power(2,n-1) )%mod;
// }
// int fac2(LL n) {
//	LL res, i;
//	if (n == 1)return n;
//	res = n;
//	for (int i = n - 1; i > 0; --i) {
//		res *= i;
//		res %= mod;
//	}
//	return res;
// }

LL gcd(LL a, LL b) {
  while (b != 0) {
    LL r = a % b;
    a = b;
    b = r;
  }
  return a;
}
vector<LL> vi;
vector<LL> vi2;
vector<vector<int>> graph;

int main() {
  std::ios_base::sync_with_stdio(false);
  cin.tie(NULL);

  // int t;   cin >> t; cin.ignore();
  int t = 1;
  for (int test_case = 0; test_case < t; ++test_case) {
    int flg = 1;
    LL ans1 = 0, ans2 = 0;
    string ans[2] = {"No", "Yes"};
    cin >> n >> m >> k;
    set<int> s[maxn];
    for (int i = 0; i < k; ++i) {
      LL y, x;
      cin >> y >> x;

      arr[y]++;
      arr2[x]++;
      s[y].insert(x);
    }
    int mx1 = arr[1];
    int mx2 = arr2[1];
    for (int i = 2; i <= n; ++i)
      mx1 = mx1 < arr[i] ? arr[i] : mx1;
    for (int i = 2; i <= m; ++i)
      mx2 = mx2 < arr2[i] ? arr2[i] : mx2;

    for (int i = 1; i <= n; ++i)
      if (arr[i] == mx1)
        vi.push_back(i);
    for (int i = 1; i <= m; ++i)
      if (arr2[i] == mx2)
        vi2.push_back(i);

    for (int i = 0; i < vi.size(); ++i) {
      for (int j = 0; j < vi2.size(); ++j) {
        if (s[vi[i]].find(vi2[j]) == s[vi[i]].end()) {
          cout << mx1 + mx2;
          flg = 0;
          break;
        }
      }
      if (!flg)
        break;
    }
    if (flg)
      cout << mx1 + mx2 - 1;
    cout << '\n';
  }
  return 0;
}