Problem p02580 (C++) — buggy submission, verdict: Runtime Error

#include <algorithm> // sort
#include <cstring>
#include <fstream>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <vector>

#define DEBUG 0

#define REP(i, n) for (long long i = 0; i < (n); i++)
typedef long long ll;
static const ll MOD = 1000000007;
static const ll INF = 1000000000000000000LL;
// 999999997000000003
// 1000000000000000000

using namespace std;

int solve() {
  ll H, W, M;
  cin >> H >> W >> M;

  set<pair<ll, ll>> st;

  REP(i, M) {
    ll a, b;
    cin >> a >> b;
    st.insert({a, b});
  }

  map<ll, ll> mph, mpw;
  ll hmaxval = 0;
  ll wmaxval = 0;
  vector<ll> hmax, wmax;
  for (auto tmp : st) {
    // 最も爆弾が設定されている行と列
    hmaxval = max(hmaxval, ++mph[tmp.first]);
    wmaxval = max(wmaxval, ++mpw[tmp.second]);
  }
  for (auto tmp : mph) {
    if (hmaxval == tmp.second)
      hmax.push_back(tmp.first);
  }
  for (auto tmp : mpw) {
    if (wmaxval == tmp.second)
      wmax.push_back(tmp.first);
  }

  ll res = hmaxval + wmaxval - 1;
  for (auto h : hmax) {
    for (auto w : wmax) {
      if (st.find({h, w}) == st.end()) {
        ++res;
        cout << res << endl;
        return 0;
      }
    }
  }

  cout << res << endl;
  return 0;
}

int main() {
  solve();
  return 0;
}


Error: WA

Fixed submission:

#include <algorithm> // sort
#include <cstring>
#include <fstream>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <vector>

#define DEBUG 0

#define REP(i, n) for (long long i = 0; i < (n); i++)
typedef long long ll;
static const ll MOD = 1000000007;
static const ll INF = 1000000000000000000LL;
// 999999997000000003
// 1000000000000000000

using namespace std;

int solve() {
  ll H, W, M;
  cin >> H >> W >> M;

  vector<ll> h(M);
  vector<ll> w(M);

  REP(i, M) {
    cin >> h[i] >> w[i];
    --h[i];
    --w[i];
  }

  //    //グリッドを作成
  //    //3*10^5だから二次元配列作成できない?
  //    vector <vector <ll>> grid(H, vector<<ll>>(W,0));
  //
  //    REP(i,M)
  //    {
  //        grid[h[i]][w[i]]++;
  //    }

  vector<pair<ll, ll>> h_bomb(H); // 縦i行目で爆発できる爆破対象
  vector<pair<ll, ll>> w_bomb(W); // 横i列目で爆発できる爆破対象

  REP(i, H) {
    h_bomb[i].second = i;
    h_bomb[i].first = 0;
  }

  REP(i, H) {
    w_bomb[i].second = i;
    w_bomb[i].first = 0;
  }

  // おそらく 1～Mの二部探索?

  REP(i, M) {
    // 同一だった場合にどうするか?
    h_bomb[h[i]].first++;
    w_bomb[w[i]].first++;
  }

  sort(h_bomb.rbegin(), h_bomb.rend());
  sort(w_bomb.rbegin(), w_bomb.rend());

  vector<ll> h_kouho;
  vector<ll> w_kouho;
  ll max_h = h_bomb[0].first;
  ll max_w = w_bomb[0].first;

  for (int i = 0; i < H; ++i) {
    if (h_bomb[i].first != max_h)
      break;
    h_kouho.push_back(h_bomb[i].second);
  }

  for (int i = 0; i < W; ++i) {
    if (w_bomb[i].first != max_w)
      break;
    w_kouho.push_back(w_bomb[i].second);
  }
  // ll res = max_h + max_w -1;
  ll res = max_h + max_w;

  set<pair<ll, ll>> s;
  for (int i = 0; i < M; ++i) {
    s.insert({h[i], w[i]});
  }

  //{h_k,w_k}の候補でかつ爆弾が設置されていない箇所が一番大きい
  for (auto h_k : h_kouho) {
    for (auto w_k : w_kouho) {
      if (s.find({h_k, w_k}) == s.end()) {
        cout << res + 1 << endl;
        return 0;
      }
    }
  }

  //    REP(i,H)
  //    {
  //        cout << h_bomb[i] << endl;
  //    }
  //
  //    REP(i,W)
  //    {
  //        cout << w_bomb[i] << endl;
  //    }

  cout << res << endl;
  return 0;
}

int main() {
  solve();
  return 0;
}