Problem p02942 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>

using namespace std;

#define pb push_back
const int maxi = 1e6 + 10;
int a[110][110], b[110][110];
string s;
int n, m;
vector<int> v[maxi];
set<pair<int, int>> st;
int c[110][110];
int cnt[110][110];

int calc(int x) {
  int val = x / m;
  if (x % m != 0)
    val++;
  return val;
}
int main() {
  cin >> n >> m;

  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) {
      scanf("%d", &a[i][j]);
      b[i][j] = a[i][j];
    }

  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) {
      int val = calc(b[i][j]);
      cnt[j][val]++;
    }

  int nula = 0;
  while (true) {
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= m; j++)
        for (int k = j + 1; k <= m; k++)
          if ((cnt[j][calc(b[i][j])] > 1 || cnt[k][calc(b[i][k])] > 1) &&
              cnt[j][calc(b[i][j])] + cnt[k][calc(b[i][k])] >=
                  cnt[j][calc(b[i][k])] + cnt[k][calc(b[i][j])]) {
            // cout<<"USAO :"<<i<<" "<<j<<" "<<k<<endl;
            cnt[j][calc(b[i][j])]--;
            cnt[k][calc(b[i][k])]--;
            cnt[j][calc(b[i][k])]++;
            cnt[k][calc(b[i][j])]++;
            swap(b[i][j], b[i][k]);
            nula++;
          }
    }

    if (!nula)
      break;
    nula = 0;
  }

  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) {
      int val = calc(b[i][j]);
      c[val][j] = b[i][j];
    }

  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++)
      printf("%d ", b[i][j]);
    printf("\n");
  }

  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++)
      printf("%d ", c[i][j]);
    printf("\n");
  }

  return 0;
}


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

using namespace std;

#define pb push_back
const int maxi = 1e6 + 10;
int a[110][110], b[110][110];
string s;
int n, m;
vector<int> v[maxi];
set<pair<int, int>> st;
int c[110][110];
int cnt[110][110];

int calc(int x) {
  int val = x / m;
  if (x % m != 0)
    val++;
  return val;
}
int main() {
  cin >> n >> m;

  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) {
      scanf("%d", &a[i][j]);
      b[i][j] = a[i][j];
    }

  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) {
      int val = calc(b[i][j]);
      cnt[j][val]++;
    }

  int nula = 0;
  while (true) {
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= m; j++)
        for (int k = j + 1; k <= m; k++)
          if (cnt[j][calc(b[i][j])] > 1 && cnt[k][calc(b[i][j])] == 0) {
            // cout<<"USAO :"<<i<<" "<<j<<" "<<k<<endl;
            cnt[j][calc(b[i][j])]--;
            cnt[k][calc(b[i][k])]--;
            cnt[j][calc(b[i][k])]++;
            cnt[k][calc(b[i][j])]++;
            swap(b[i][j], b[i][k]);
            nula++;
          }
    }

    if (!nula)
      break;
    nula = 0;
  }

  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) {
      int val = calc(b[i][j]);
      c[val][j] = b[i][j];
    }

  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++)
      printf("%d ", b[i][j]);
    printf("\n");
  }

  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++)
      printf("%d ", c[i][j]);
    printf("\n");
  }

  return 0;
}