Problem p02942 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define REP(i, a, b) for (int i = (a), _end_ = (b); i <= _end_; i++)
#define DREP(i, a, b) for (int i = (a), _end_ = (b); i >= _end_; i--)
#define EREP(i, u) for (int i = start[u]; i; i = e[i].next)
#define fi first
#define se second
#define mkr(a, b) make_pair(a, b)
#define SZ(A) ((int)A.size())
template <class T> inline void chkmin(T &a, T b) {
  if (a > b)
    a = b;
}
template <class T> inline void chkmax(T &a, T b) {
  if (a < b)
    a = b;
}
inline void myassert(bool a, string s) {
  if (!a)
    cerr << s << endl, exit(0);
}
inline int read() {
  int s = 0, f = 1;
  char ch = getchar();
  while (!isdigit(ch) && ch != '-')
    ch = getchar();
  if (ch == '-')
    ch = getchar(), f = -1;
  while (isdigit(ch))
    s = s * 10 + ch - '0', ch = getchar();
  return ~f ? s : -s;
}

const int maxn = 120;

int n, m, col[maxn][maxn];

vector<int> rest[maxn][maxn];

inline void init() {
  n = read();
  m = read();
  REP(i, 1, n) REP(j, 1, m) {
    int x = read();
    col[i][j] = (x + m - 1) / m;
    rest[i][col[i][j]].push_back(x);
  }
}

int f[maxn][maxn];
int mch[maxn], vis[maxn];

inline bool dfs(int u) {
  REP(v, 1, n) if (f[u][v] && !vis[v]) {
    vis[v] = 1;
    if (!mch[v] || dfs(v)) {
      mch[v] = u;
      return 1;
    }
  }
  return 0;
}

int B[maxn][maxn];
int C[maxn][maxn];

inline void doing() {
  REP(k, 1, m) {
    REP(i, 1, n) REP(j, 1, n) f[i][j] = !rest[i][j].empty();
    memset(mch, 0, sizeof(int) * (n + 1));
    REP(i, 1, n) {
      memset(vis, 0, sizeof(int) * (n + 1));
      dfs(i);
    }
    REP(i, 1, n) {
      int x = mch[i], y = i;
      B[x][k] = rest[x][y].back();
      rest[x][y].pop_back();
      C[y][k] = B[x][k];
    }
  }
  REP(i, 1, n) REP(j, 1, m) printf("%d%c", B[i][j], j == m ? '\n' : ' ');
  REP(i, 1, n) REP(j, 1, m) printf("%d%c", C[i][j], j == m ? '\n' : ' ');
}

int main() {
  init();
  doing();
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define REP(i, a, b) for (int i = (a), _end_ = (b); i <= _end_; i++)
#define DREP(i, a, b) for (int i = (a), _end_ = (b); i >= _end_; i--)
#define EREP(i, u) for (int i = start[u]; i; i = e[i].next)
#define fi first
#define se second
#define mkr(a, b) make_pair(a, b)
#define SZ(A) ((int)A.size())
template <class T> inline void chkmin(T &a, T b) {
  if (a > b)
    a = b;
}
template <class T> inline void chkmax(T &a, T b) {
  if (a < b)
    a = b;
}
inline void myassert(bool a, string s) {
  if (!a)
    cerr << s << endl, exit(0);
}
inline int read() {
  int s = 0, f = 1;
  char ch = getchar();
  while (!isdigit(ch) && ch != '-')
    ch = getchar();
  if (ch == '-')
    ch = getchar(), f = -1;
  while (isdigit(ch))
    s = s * 10 + ch - '0', ch = getchar();
  return ~f ? s : -s;
}

const int maxn = 120;

int n, m, col[maxn][maxn];

vector<int> rest[maxn][maxn];

inline void init() {
  n = read();
  m = read();
  REP(i, 1, n) REP(j, 1, m) {
    int x = read();
    col[i][j] = (x + m - 1) / m;
    rest[i][col[i][j]].push_back(x);
  }
}

int f[maxn][maxn];
int mch[maxn], vis[maxn];

inline bool dfs(int u) {
  REP(v, 1, n) if (f[u][v] && !vis[v]) {
    vis[v] = 1;
    if (!mch[v] || dfs(mch[v])) {
      mch[v] = u;
      return 1;
    }
  }
  return 0;
}

int B[maxn][maxn];
int C[maxn][maxn];

inline void doing() {
  REP(k, 1, m) {
    REP(i, 1, n) REP(j, 1, n) f[i][j] = !rest[i][j].empty();
    memset(mch, 0, sizeof(int) * (n + 1));
    REP(i, 1, n) {
      memset(vis, 0, sizeof(int) * (n + 1));
      dfs(i);
    }
    REP(i, 1, n) {
      int x = mch[i], y = i;
      B[x][k] = rest[x][y].back();
      rest[x][y].pop_back();
      C[y][k] = B[x][k];
    }
  }
  REP(i, 1, n) REP(j, 1, m) printf("%d%c", B[i][j], j == m ? '\n' : ' ');
  REP(i, 1, n) REP(j, 1, m) printf("%d%c", C[i][j], j == m ? '\n' : ' ');
}

int main() {
  init();
  doing();
  return 0;
}