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

#include <algorithm> // count_ifに必要
#include <array>     // sizeはコンパイル時定数で固定
#include <cmath>
#include <iomanip> // cout << setprecision(15) << x で小数の出力精度を指定
#include <iostream>
#include <map>
#include <numeric> // accumulate, gcd
#include <queue>   // priority_queue も入ってる
#include <random>
#include <set> // 要素数は size() で取得 multisetもある
#include <stack>
#include <string>
#include <tuple>
#include <utility> //pair
#include <vector>

using namespace std;
// 問題が起こるまでintは使用禁止2020-04-13
using ll = long long;

#define rep(i, n) for (int i = 0; i < (n); ++i)

template <class InputIterator, class T>
bool contains_itr(InputIterator iterator, const T &value) {
  if (find(iterator.begin(), iterator.end(), value) == iterator.end())
    return false;
  else
    return true;
}

template <class T> bool contains_set(set<T> st, const T &value) {
  if (st.find(value) == st.end()) {
    return false;
  } else {
    return true;
  }
}

template <class InputIterator> auto sum(InputIterator iterator) {
  return accumulate(iterator.begin(), iterator.end(), 0);
}

// endは排他的(exclusive)なので注意
vector<ll> range(ll begin, ll end) {
  vector<ll> result;
  for (ll i = begin; i < end; ++i) {
    result.push_back(i);
  }
  return result;
}

random_device seed_gen;
mt19937 engine(seed_gen());
// 0, 1, 2 のどれかが得られる一様分布
// uniform_int_distribution<> dist(0, 2);
// cout << dist(engine) << endl;
// みたいに、先に確率分布を宣言して、そこにengineを与えて使う。

// =========ここまでテンプレ============

int main() {
  ll h, w, m;
  cin >> h >> w >> m;
  vector<ll> hCount(h, 0);
  ll maxHCount = 0;
  vector<ll> wCount(w, 0);
  ll maxWCount = 0;
  vector<ll> argmaxHs;
  vector<ll> argmaxWs;
  vector<pair<ll, ll>> targets;
  vector<ll> hs(m);
  vector<ll> ws(m);
  rep(i, m) {
    ll hi, wi;
    cin >> hi >> wi;
    --hi;
    --wi;
    hs[i] = hi;
    ws[i] = wi;
  }
  rep(i, m) {
    // ll hi, wi;
    // cin >> hi >> wi;
    // --hi;
    // --wi;
    ll hi = hs[i];
    ll wi = ws[i];
    targets.push_back(pair<ll, ll>{hi, wi});
    ++hCount[hi];
    if (maxHCount < hCount[hi]) {
      maxHCount = hCount[hi];
      argmaxHs = vector<ll>{hi};
    } else if (maxHCount == hCount[hi]) {
      argmaxHs.push_back(hi);
    }
    ++wCount[wi];
    if (maxWCount < wCount[wi]) {
      maxWCount = wCount[wi];
      argmaxWs = vector<ll>{wi};
    } else if (maxWCount == wCount[wi]) {
      argmaxWs.push_back(wi);
    }
  }

  // 行、列ごとに最大のとこを選びつつ、交点にターゲットがない場所を選べるか調べる。
  // ターゲットがない場所を選べるなら単なる和、必ずターゲットがあるなら和-1
  // 一個でもターゲットがない組み合わせを選べたらmodify = 0にします
  ll modify = -1;
  // ll chosazumi = 0;
  sort(targets.begin(), targets.end());
  for (auto itrh = argmaxHs.begin(); itrh != argmaxHs.end(); ++itrh) {
    if (modify == 0) {
      break;
    }
    for (auto itrw = argmaxWs.begin(); itrw != argmaxWs.end(); ++itrw) {
      //  if (targets[(*itrh)][(*itrw)] == false)
      if (!binary_search(targets.begin(), targets.end(),
                         pair<ll, ll>{(*itrh), (*itrw)})) {
        modify = 0;
        break;
      }
      // ++chosazumi;
    }
  }
  ll result = maxHCount + maxWCount + modify;
  std::cout << result << endl;
  return 0;
}

Error: 0

Fixed submission:

#include <algorithm> // count_ifに必要
#include <array>     // sizeはコンパイル時定数で固定
#include <cmath>
#include <iomanip> // cout << setprecision(15) << x で小数の出力精度を指定
#include <iostream>
#include <map>
#include <numeric> // accumulate, gcd
#include <queue>   // priority_queue も入ってる
#include <random>
#include <set> // 要素数は size() で取得 multisetもある
#include <stack>
#include <string>
#include <tuple>
#include <utility> //pair
#include <vector>

using namespace std;
// 問題が起こるまでintは使用禁止2020-04-13
using ll = long long;

#define rep(i, n) for (int i = 0; i < (n); ++i)

template <class InputIterator, class T>
bool contains_itr(InputIterator iterator, const T &value) {
  if (find(iterator.begin(), iterator.end(), value) == iterator.end())
    return false;
  else
    return true;
}

template <class T> bool contains_set(set<T> st, const T &value) {
  if (st.find(value) == st.end()) {
    return false;
  } else {
    return true;
  }
}

template <class InputIterator> auto sum(InputIterator iterator) {
  return accumulate(iterator.begin(), iterator.end(), 0);
}

// endは排他的(exclusive)なので注意
vector<ll> range(ll begin, ll end) {
  vector<ll> result;
  for (ll i = begin; i < end; ++i) {
    result.push_back(i);
  }
  return result;
}

random_device seed_gen;
mt19937 engine(seed_gen());
// 0, 1, 2 のどれかが得られる一様分布
// uniform_int_distribution<> dist(0, 2);
// cout << dist(engine) << endl;
// みたいに、先に確率分布を宣言して、そこにengineを与えて使う。

// =========ここまでテンプレ============

int main() {
  ll h, w, m;
  cin >> h >> w >> m;
  vector<ll> hCount(h, 0);
  ll maxHCount = 0;
  vector<ll> wCount(w, 0);
  ll maxWCount = 0;
  vector<ll> argmaxHs;
  vector<ll> argmaxWs;
  vector<vector<bool>> targets(h, vector<bool>(w, false));
  vector<ll> hs(m);
  vector<ll> ws(m);
  rep(i, m) {
    ll hi, wi;
    cin >> hi >> wi;
    --hi;
    --wi;
    hs[i] = hi;
    ws[i] = wi;
  }
  rep(i, m) {
    // ll hi, wi;
    // cin >> hi >> wi;
    // --hi;
    // --wi;
    ll hi = hs[i];
    ll wi = ws[i];
    targets[hi][wi] = true;
    ++hCount[hi];
    if (maxHCount < hCount[hi]) {
      maxHCount = hCount[hi];
      argmaxHs = vector<ll>{hi};
    } else if (maxHCount == hCount[hi]) {
      argmaxHs.push_back(hi);
    }
    ++wCount[wi];
    if (maxWCount < wCount[wi]) {
      maxWCount = wCount[wi];
      argmaxWs = vector<ll>{wi};
    } else if (maxWCount == wCount[wi]) {
      argmaxWs.push_back(wi);
    }
  }

  // 行、列ごとに最大のとこを選びつつ、交点にターゲットがない場所を選べるか調べる。
  // ターゲットがない場所を選べるなら単なる和、必ずターゲットがあるなら和-1
  // 一個でもターゲットがない組み合わせを選べたらmodify = 0にします
  ll modify = -1;
  // ll chosazumi = 0;
  for (auto itrh = argmaxHs.begin(); itrh != argmaxHs.end(); ++itrh) {
    if (modify == 0) {
      break;
    }
    for (auto itrw = argmaxWs.begin(); itrw != argmaxWs.end(); ++itrw) {
      if (targets[(*itrh)][(*itrw)] == false) {
        modify = 0;
        break;
      }
      // ++chosazumi;
    }
  }
  ll result = maxHCount + maxWCount + modify;
  std::cout << result << endl;
  return 0;
}