Problem p02942 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
#define N 210
#define M 200010
#define inf 2147483647
#define col(x) (((x - 1) / m) + 1)
inline int read() {
  int x = 0;
  char ch = getchar();
  while (!isdigit(ch))
    ch = getchar();
  while (isdigit(ch))
    x = x * 10 + ch - '0', ch = getchar();
  return x;
}
int tot = 1;
int fir[N], nex[M], got[M], tak[M];
inline void AddEdge(int x, int y, int z) {
  nex[++tot] = fir[x], fir[x] = tot, got[tot] = y, tak[tot] = z;
}
int a[N][N], b[N][N];
vector<int> v[N][N];
int dep[N], que[N];
inline int bfs(int s, int t) {
  memset(dep, 0, sizeof(dep));
  int l = 1, r = 1;
  dep[s] = 1, que[1] = s;
  while (l <= r) {
    int x = que[l++];
    for (int i = fir[x]; i; i = nex[i]) {
      int y = got[i];
      if (dep[y] || !tak[i])
        continue;
      dep[y] = dep[x] + 1, que[++r] = y;
    }
  }
  return dep[t];
}
inline int dfs(int x, int t, int flow) {
  int rest = flow;
  if (x == t)
    return flow;
  for (int i = fir[x]; i && rest; i = nex[i]) {
    int y = got[i];
    if (!tak[i] || dep[y] != dep[x] + 1)
      continue;
    int k = dfs(y, t, min(rest, tak[i]));
    if (!k)
      dep[y] = 0;
    tak[i] -= k, tak[i ^ 1] += k, rest -= k;
  }
  return flow - rest;
}
int main() {
  int n = read(), m = read();
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) {
      a[i][j] = read();
      v[i][col(a[i][j])].push_back(a[i][j]);
    }
  for (int w = 1; w <= m; w++) {
    memset(fir, 0, sizeof(fir));
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++)
        if (v[i][j].size()) {
          AddEdge(i, j + n, 1), AddEdge(j + n, i, 0);
        }
    int s = 2 * n + 1, t = s + 1;
    for (int i = 1; i <= n; i++)
      AddEdge(s, i, 1), AddEdge(i, s, 0), AddEdge(t, i + n, 0),
          AddEdge(i + n, t, 1);
    while (bfs(s, t))
      dfs(s, t, inf);
    for (int i = 1; i <= n; i++) {
      for (int j = fir[i]; j; j = nex[j]) {
        if (got[j] > n && !tak[j])
          b[i][w] = v[i][got[j] - n].back(), v[i][got[j] - n].pop_back();
      }
    }
  }
  for (int i = 1; i <= n; i++, putchar('\n'))
    for (int j = 1; j <= m; j++)
      printf("%d ", a[col(b[i][j])][j] = b[i][j]);
  for (int i = 1; i <= n; i++, putchar('\n'))
    for (int j = 1; j <= m; j++)
      printf("%d ", a[i][j]);
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
#define N 210
#define M 200010
#define inf 2147483647
#define col(x) (((x - 1) / m) + 1)
inline int read() {
  int x = 0;
  char ch = getchar();
  while (!isdigit(ch))
    ch = getchar();
  while (isdigit(ch))
    x = x * 10 + ch - '0', ch = getchar();
  return x;
}
int tot = 1;
int fir[N], nex[M], got[M], tak[M];
inline void AddEdge(int x, int y, int z) {
  nex[++tot] = fir[x], fir[x] = tot, got[tot] = y, tak[tot] = z;
}
int a[N][N], b[N][N];
vector<int> v[N][N];
int dep[N], que[N];
inline int bfs(int s, int t) {
  memset(dep, 0, sizeof(dep));
  int l = 1, r = 1;
  dep[s] = 1, que[1] = s;
  while (l <= r) {
    int x = que[l++];
    for (int i = fir[x]; i; i = nex[i]) {
      int y = got[i];
      if (dep[y] || !tak[i])
        continue;
      dep[y] = dep[x] + 1, que[++r] = y;
    }
  }
  return dep[t];
}
inline int dfs(int x, int t, int flow) {
  int rest = flow;
  if (x == t)
    return flow;
  for (int i = fir[x]; i && rest; i = nex[i]) {
    int y = got[i];
    if (!tak[i] || dep[y] != dep[x] + 1)
      continue;
    int k = dfs(y, t, min(rest, tak[i]));
    if (!k)
      dep[y] = 0;
    tak[i] -= k, tak[i ^ 1] += k, rest -= k;
  }
  return flow - rest;
}
int main() {
  int n = read(), m = read();
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) {
      a[i][j] = read();
      v[i][col(a[i][j])].push_back(a[i][j]);
    }
  for (int w = 1; w <= m; w++) {
    tot = 1;
    memset(fir, 0, sizeof(fir));
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++)
        if (v[i][j].size()) {
          AddEdge(i, j + n, 1), AddEdge(j + n, i, 0);
        }
    int s = 2 * n + 1, t = s + 1;
    for (int i = 1; i <= n; i++)
      AddEdge(s, i, 1), AddEdge(i, s, 0), AddEdge(t, i + n, 0),
          AddEdge(i + n, t, 1);
    while (bfs(s, t))
      dfs(s, t, inf);
    for (int i = 1; i <= n; i++) {
      for (int j = fir[i]; j; j = nex[j]) {
        if (got[j] > n && !tak[j])
          b[i][w] = v[i][got[j] - n].back(), v[i][got[j] - n].pop_back();
      }
    }
  }
  for (int i = 1; i <= n; i++, putchar('\n'))
    for (int j = 1; j <= m; j++)
      printf("%d ", a[col(b[i][j])][j] = b[i][j]);
  for (int i = 1; i <= n; i++, putchar('\n'))
    for (int j = 1; j <= m; j++)
      printf("%d ", a[i][j]);
  return 0;
}