Problem p02942 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>

using namespace std;

#define REP(i, n) for (ll(i) = (0); (i) < (n); ++i)
#define REV(i, n) for (ll(i) = (n)-1; (i) >= 0; --i)
#define PB push_back
#define EB emplace_back
#define MP make_pair
#define FI first
#define SE second
#define SHOW1d(v, n)                                                           \
  {                                                                            \
    REP(WW, n) cerr << v[WW] << ' ';                                           \
    cerr << endl << endl;                                                      \
  }
#define SHOW2d(v, WW, HH)                                                      \
  {                                                                            \
    REP(W_, WW) {                                                              \
      REP(H_, HH) cerr << v[W_][H_] << ' ';                                    \
      cerr << endl;                                                            \
    }                                                                          \
    cerr << endl;                                                              \
  }
#define ALL(v) v.begin(), v.end()
#define Decimal fixed << setprecision(20)
#define INF 1000000000
#define LLINF 1000000000000000000LL
#define MOD 998244353

typedef long long ll;
typedef pair<ll, ll> P;

int ch[111111];
int mp[111][111];
int used[111];
bool used_gyou[111];
int n, m;

void init() {
  int cou = 0;
  for (int i = 1; i < 111111; i++) {
    ch[i] = cou;
    if (i % m == 0) {
      cou++;
    }
  }

  REP(i, n) {
    REP(j, m) { cin >> mp[i][j]; }
  }
}

bool check_gyou(int now_retsu, int now_gyou) {
  // cout << "check_gyou " << now_retsu << " " << now_gyou << endl;
  used_gyou[now_gyou] = true;
  for (int i = now_retsu; i < m; i++) {
    if (used[ch[mp[now_gyou][i]]] == -1) {
      used[ch[mp[now_gyou][i]]] = now_gyou;
      swap(mp[now_gyou][now_retsu], mp[now_gyou][i]);
      return true;
    }
  }

  for (int i = now_retsu; i < m; i++) {
    if (used_gyou[used[ch[mp[now_gyou][i]]]]) {
      if (check_gyou(now_retsu, used[ch[mp[now_gyou][i]]])) {
        used[ch[mp[now_gyou][i]]] = now_gyou;
        swap(mp[now_gyou][now_retsu], mp[now_gyou][i]);
        return true;
      }
    }
  }

  return false;
}

void seica_gyou() {
  REP(retsu, m) {
    REP(i, 111) { used[i] = -1; }

    REP(gyou, n) {
      bool flag = false;
      for (int i = retsu; i < m; i++) {
        // cout << "# " << gyou << " " << retsu << " " << i << " " <<
        // mp[gyou][i] << " " << used[ch[mp[gyou][i]]] << endl;
        if (used[ch[mp[gyou][i]]] == -1) {
          used[ch[mp[gyou][i]]] = gyou;
          swap(mp[gyou][retsu], mp[gyou][i]);
          flag = true;
          break;
        }
      }

      if (flag) {
        // cout << "A " << gyou << " " << retsu << " " << mp[gyou][retsu] <<
        // endl;
        continue;
      }

      REP(i, 111) { used_gyou[i] = false; }
      for (int i = retsu; i < m; i++) {
        if (check_gyou(retsu, used[ch[mp[gyou][i]]])) {
          used[ch[mp[gyou][i]]] = gyou;
          swap(mp[gyou][retsu], mp[gyou][i]);
          flag = true;
          break;
        }
      }

      if (!flag) {
        cout << "!!!" << endl;
        exit(1);
      }
      // cout << "B ";REP(i, gyou+1)cout << mp[i][retsu] << " ";cout << endl;
    }
    /*
    REP(i, n){
            REP(j, m){
                    cout << mp[i][j] << " ";
            }
            cout << endl;
    }
    cout << endl;
    */
  }
}

void seica_retsu() {
  REP(retsu, m) {
    vector<int> v;
    REP(gyou, n) { v.PB(mp[gyou][retsu]); }

    sort(ALL(v));
    REP(gyou, n) { mp[gyou][retsu] = v[gyou]; }
  }
}

int main() {
  cin.tie(0);
  cout.tie(0);
  ios::sync_with_stdio(false);
  cin >> n >> m;
  init();
  seica_gyou();
  REP(i, n) {
    REP(j, m) { cout << mp[i][j] << " "; }
    cout << endl;
  }
  seica_retsu();
  REP(i, n) {
    REP(j, m) { cout << mp[i][j] << " "; }
    cout << endl;
  }
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>

using namespace std;

#define REP(i, n) for (ll(i) = (0); (i) < (n); ++i)
#define REV(i, n) for (ll(i) = (n)-1; (i) >= 0; --i)
#define PB push_back
#define EB emplace_back
#define MP make_pair
#define FI first
#define SE second
#define SHOW1d(v, n)                                                           \
  {                                                                            \
    REP(WW, n) cerr << v[WW] << ' ';                                           \
    cerr << endl << endl;                                                      \
  }
#define SHOW2d(v, WW, HH)                                                      \
  {                                                                            \
    REP(W_, WW) {                                                              \
      REP(H_, HH) cerr << v[W_][H_] << ' ';                                    \
      cerr << endl;                                                            \
    }                                                                          \
    cerr << endl;                                                              \
  }
#define ALL(v) v.begin(), v.end()
#define Decimal fixed << setprecision(20)
#define INF 1000000000
#define LLINF 1000000000000000000LL
#define MOD 998244353

typedef long long ll;
typedef pair<ll, ll> P;

int ch[111111];
int mp[111][111];
int used[111];
bool used_gyou[111];
int n, m;

void init() {
  int cou = 0;
  for (int i = 1; i < 111111; i++) {
    ch[i] = cou;
    if (i % m == 0) {
      cou++;
    }
  }

  REP(i, n) {
    REP(j, m) { cin >> mp[i][j]; }
  }
}

bool check_gyou(int now_retsu, int now_gyou) {
  // cout << "check_gyou " << now_retsu << " " << now_gyou << endl;
  used_gyou[now_gyou] = true;
  for (int i = now_retsu; i < m; i++) {
    if (used[ch[mp[now_gyou][i]]] == -1) {
      used[ch[mp[now_gyou][i]]] = now_gyou;
      swap(mp[now_gyou][now_retsu], mp[now_gyou][i]);
      return true;
    }
  }

  for (int i = now_retsu; i < m; i++) {
    if (!used_gyou[used[ch[mp[now_gyou][i]]]]) {
      if (check_gyou(now_retsu, used[ch[mp[now_gyou][i]]])) {
        used[ch[mp[now_gyou][i]]] = now_gyou;
        swap(mp[now_gyou][now_retsu], mp[now_gyou][i]);
        return true;
      }
    }
  }

  return false;
}

void seica_gyou() {
  REP(retsu, m) {
    REP(i, 111) { used[i] = -1; }

    REP(gyou, n) {
      bool flag = false;
      for (int i = retsu; i < m; i++) {
        // cout << "# " << gyou << " " << retsu << " " << i << " " <<
        // mp[gyou][i] << " " << used[ch[mp[gyou][i]]] << endl;
        if (used[ch[mp[gyou][i]]] == -1) {
          used[ch[mp[gyou][i]]] = gyou;
          swap(mp[gyou][retsu], mp[gyou][i]);
          flag = true;
          break;
        }
      }

      if (flag) {
        // cout << "A " << gyou << " " << retsu << " " << mp[gyou][retsu] <<
        // endl;
        continue;
      }

      REP(i, 111) { used_gyou[i] = false; }
      for (int i = retsu; i < m; i++) {
        if (check_gyou(retsu, used[ch[mp[gyou][i]]])) {
          used[ch[mp[gyou][i]]] = gyou;
          swap(mp[gyou][retsu], mp[gyou][i]);
          flag = true;
          break;
        }
      }

      if (!flag) {
        cout << "!!!" << endl;
        exit(1);
      }
      // cout << "B ";REP(i, gyou+1)cout << mp[i][retsu] << " ";cout << endl;
    }
    /*
    REP(i, n){
            REP(j, m){
                    cout << mp[i][j] << " ";
            }
            cout << endl;
    }
    cout << endl;
    */
  }
}

void seica_retsu() {
  REP(retsu, m) {
    vector<int> v;
    REP(gyou, n) { v.PB(mp[gyou][retsu]); }

    sort(ALL(v));
    REP(gyou, n) { mp[gyou][retsu] = v[gyou]; }
  }
}

int main() {
  cin.tie(0);
  cout.tie(0);
  ios::sync_with_stdio(false);
  cin >> n >> m;
  init();
  seica_gyou();
  REP(i, n) {
    REP(j, m) { cout << mp[i][j] << " "; }
    cout << endl;
  }
  seica_retsu();
  REP(i, n) {
    REP(j, m) { cout << mp[i][j] << " "; }
    cout << endl;
  }
  return 0;
}