Problem p02942 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#define maxn 128
using namespace std;

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

void read() {
  cin >> n >> m;

  int i, j;

  for (i = 0; i < n; i++)
    for (j = 0; j < m; j++)
      cin >> a[i][j];
}

vector<int> v[maxn];
bool used[maxn * maxn];
bool tused[maxn * maxn];
int match[maxn * maxn];

void clearr() {
  int i;
  for (i = 0; i < maxn; i++)
    v[i].clear();
}

/*void build()
{
    int i,j;
    for(i=0;i<n;i++)
     {
        int sz=v[i].size();
        for(j=0;j<v[i].size();j++)
        {
            int nb=v[i][j];
            if(!match[nb])
            {
                match[nb]=i;
                break;
            }
        }
     }
}*/

bool khun(int i) {
  // cout<<i<<" ";
  if (tused[i])
    return false;
  tused[i] = true;
  int j, sz = v[i].size();
  for (j = 0; j < sz; j++) {
    int t = v[i][j];
    if (match[t] == -1 || khun(match[t])) {
      match[t] = i;
      match[i] = t;
      return true;
    }
  }
  return false;
}

int ans[maxn][maxn];
void solve() {
  int i, j, k;
  for (i = 0; i < m; i++) {
    clearr();
    for (j = 0; j < n; j++)
      for (k = 0; k < m; k++)
        if (!used[a[j][k]]) {
          v[j].push_back((a[j][k] - 1) / m + n);
          v[(a[j][k] - 1) / m + n].push_back(j);
        }
    memset(match, -1, sizeof(match));
    for (j = 0; j < n; j++) {
      memset(tused, 0, sizeof(tused));
      khun(j);
    }

    for (j = 0; j < n; j++) {
      if (match[j] != -1) {
        for (k = 0; k < m; k++) {
          if ((a[j][k] - 1) / m + n == match[j] && !used[a[j][k]]) {
            used[a[j][k]] = true;
            ans[j][i] = a[j][k];
            break;
          }
        }
      }
    }
  }

  for (i = 0; i < n; i++) {
    for (j = 0; j < m; j++)
      cout << ans[i][j] << " ";
    cout << endl;
  }
}

// bool ans[maxn][maxn];
int main() {
  int i, j, k;
  read();
  solve();

  for (i = 0; i < n; i++) {
    for (j = 0; j < m; j++)
      for (k = 0; k < n; k++)
        if ((ans[k][j] - 1) / m == i) {
          cout << ans[k][j] << " ";
          break;
        }

    cout << endl;
  }
  return 0;
}

/*
3 4
1 4 7 10
2 5 8 11
3 6 9 12
*/


Fixed submission:
#include <bits/stdc++.h>
#define maxn 128
using namespace std;

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

void read() {
  cin >> n >> m;

  int i, j;

  for (i = 0; i < n; i++)
    for (j = 0; j < m; j++)
      cin >> a[i][j];
}

vector<int> v[maxn * maxn];
bool used[maxn * maxn];
bool tused[maxn * maxn];
int match[maxn * maxn];

void clearr() {
  int i;
  for (i = 0; i < maxn; i++)
    v[i].clear();
}

/*void build()
{
    int i,j;
    for(i=0;i<n;i++)
     {
        int sz=v[i].size();
        for(j=0;j<v[i].size();j++)
        {
            int nb=v[i][j];
            if(!match[nb])
            {
                match[nb]=i;
                break;
            }
        }
     }
}*/

bool khun(int i) {
  // cout<<i<<" ";
  if (tused[i])
    return false;
  tused[i] = true;
  int j, sz = v[i].size();
  for (j = 0; j < sz; j++) {
    int t = v[i][j];
    if (match[t] == -1 || khun(match[t])) {
      match[t] = i;
      match[i] = t;
      return true;
    }
  }
  return false;
}

int ans[maxn][maxn];
void solve() {
  int i, j, k;
  for (i = 0; i < m; i++) {
    clearr();
    for (j = 0; j < n; j++)
      for (k = 0; k < m; k++)
        if (!used[a[j][k]]) {
          v[j].push_back((a[j][k] - 1) / m + n);
          v[(a[j][k] - 1) / m + n].push_back(j);
        }
    memset(match, -1, sizeof(match));
    for (j = 0; j < n; j++) {
      memset(tused, 0, sizeof(tused));
      khun(j);
    }

    for (j = 0; j < n; j++) {
      if (match[j] != -1) {
        for (k = 0; k < m; k++) {
          if ((a[j][k] - 1) / m + n == match[j] && !used[a[j][k]]) {
            used[a[j][k]] = true;
            ans[j][i] = a[j][k];
            break;
          }
        }
      }
    }
  }

  for (i = 0; i < n; i++) {
    for (j = 0; j < m; j++)
      cout << ans[i][j] << " ";
    cout << endl;
  }
}

// bool ans[maxn][maxn];
int main() {
  int i, j, k;
  read();
  solve();

  for (i = 0; i < n; i++) {
    for (j = 0; j < m; j++)
      for (k = 0; k < n; k++)
        if ((ans[k][j] - 1) / m == i) {
          cout << ans[k][j] << " ";
          break;
        }

    cout << endl;
  }
  return 0;
}

/*
3 4
1 4 7 10
2 5 8 11
3 6 9 12
*/