Problem p03133 (C++)

Buggy submission (status: Runtime Error):
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
const int mod = 998244353;
const int N = 700;
int n, m, a[N][N];
int od[N], ev[N], bit[N], xxj[N];
int main() {
  cin >> n >> m;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
      cin >> a[i][j], a[i][j] &= 1;
  if (n < m) {
    for (int i = 1; i <= n; i++)
      for (int j = i + 1; j <= m; j++)
        swap(a[i][j], a[j][i]);
    swap(n, m);
  }

  int u = max(n, m);
  od[1] = 1;
  ev[1] = 3;
  for (int i = 2; i <= u; i++) {
    od[i] = (ev[i - 1] + 3ll * od[i - 1] % mod) % mod;
    ev[i] = (od[i - 1] + 3ll * ev[i - 1] % mod) % mod;
  }
  int cnt = 0;
  for (int i = 1; i <= u; i++) {
    int p = i;
    for (int j = i + 1; j <= u; j++)
      if (a[i][i] < a[j][i])
        p = j;
    if (p != i)
      swap(a[p], a[i]);
    if (!a[i][i]) {
      u++;
      swap(a[i], a[u]);
      continue;
    }
    cnt++;
    for (int j = i + 1; j <= u; j++)
      if (a[j][i])
        for (int k = i; k <= u; k++)
          a[j][k] ^= a[i][k];
  }
  /*
          for(int i=1;i<=n;i++)
          {
                  for(int j=1;j<=m;j++)
                          if(a[i][j])
                          {
                                  if(xxj[j])
                                          for(int k=j;k<=m;k++)
                                                  a[i][k]^=a[xxj[j]][k];
                                  else {xxj[j]=i;cnt++;break;}
                          }
          }
  */
  bit[0] = 1;
  for (int i = 1; i <= u; i++)
    bit[i] = 2ll * bit[i - 1] % mod;
  int bs = 1ll * bit[n - cnt] * bit[m - cnt] % mod;
  printf("%lld\n", 1ll * od[cnt] * bs % mod);
}


Fixed submission:
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
const int mod = 998244353;
const int N = 700;
int n, m, a[N][N];
int od[N], ev[N], bit[N], xxj[N];
int main() {
  cin >> n >> m;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
      cin >> a[i][j], a[i][j] &= 1;
  if (n < m) {
    for (int i = 1; i <= n; i++)
      for (int j = i + 1; j <= m; j++)
        swap(a[i][j], a[j][i]);
    swap(n, m);
  }

  int u = max(n, m);
  od[1] = 1;
  ev[1] = 3;
  for (int i = 2; i <= u; i++) {
    od[i] = (ev[i - 1] + 3ll * od[i - 1] % mod) % mod;
    ev[i] = (od[i - 1] + 3ll * ev[i - 1] % mod) % mod;
  }
  int cnt = 0;
  for (int i = 1; i <= u; i++) {
    int p = i;
    for (int j = i + 1; j <= u; j++)
      if (a[i][i] < a[j][i])
        p = j;
    if (p != i)
      swap(a[p], a[i]);
    if (!a[i][i]) {
      int fl = 0;
      for (int j = i + 1; j <= m; j++)
        fl |= a[i][j];
      if (fl)
        swap(a[i], a[++u]);
      continue;
    }
    cnt++;
    for (int j = i + 1; j <= u; j++)
      if (a[j][i])
        for (int k = i; k <= u; k++)
          a[j][k] ^= a[i][k];
  }
  /*
          for(int i=1;i<=n;i++)
          {
                  for(int j=1;j<=m;j++)
                          if(a[i][j])
                          {
                                  if(xxj[j])
                                          for(int k=j;k<=m;k++)
                                                  a[i][k]^=a[xxj[j]][k];
                                  else {xxj[j]=i;cnt++;break;}
                          }
          }
  */
  bit[0] = 1;
  for (int i = 1; i <= u; i++)
    bit[i] = 2ll * bit[i - 1] % mod;
  int bs = 1ll * bit[n - cnt] * bit[m - cnt] % mod;
  printf("%lld\n", 1ll * od[cnt] * bs % mod);
}