Problem p03263 (C++)

Buggy submission (status: Runtime Error):
#define _CRT_SECURE_NO_WARNINGS

/* include ***********************/
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* define *************************/
// for
#define REP(i, n) for (int i = 0, i##_len = (int)(n); i < i##_len; i++)
#define REPS(i, n) for (int i = 1, i##_len = (int)(n); i <= i##_len; i++)
#define RREP(i, n) for (int i = (int)(n)-1; i >= 0; i--)
#define RREPS(i, n) for (int i = (int)(n); i > 0; i--)
#define FOR(i, s, n)                                                           \
  for (int i = (int)(s), i##_len = (int)(n); i < i##_len; i++)

// printf
#define PRINTD(d) printf("%d\n", (d))
#define PRINTL(d) printf("%lld\n", (d))

// memset
#define m0(s) memset(s, 0, sizeof(s))
#define ml(s) memset(s, 63, sizeof(s))
#define fill(s, c) memset(s, c, sizeof(s))

#define INF 1e9

typedef long long ll;
int cnt = 0;
int ans[500][4];
int a[500][500];
int f[500] = {0};

int diff[4][2] = {
    {0, -1},
    {-1, 0},
    {1, 0},
    {0, 1},
};

int Min(int a, int b) { return (a) < (b) ? (a) : (b); }
ll Max(ll a, ll b) { return (a) > (b) ? (a) : (b); }
void Swap(int *a, int *b) {
  int tmp = *a;
  *a = *b;
  *b = tmp;
}
void hSwap(int x[], int i, int j) {
  int temp;

  temp = x[i];
  x[i] = x[j];
  x[j] = temp;
}

void ShowData(int x[], int left, int right) {
  int i;
  for (i = left; i <= right; i++)
    printf("%d  ", x[i]);
  printf("\n");
}
void QSort(int x[], int left, int right, int n) {
  int i, j;  // 左端,右端
  int pivot; // 軸

  i = left;
  j = right;
  pivot = x[(left + right) / 2];

  while (1) {
    if (n > 0) { // n>0なら昇順、n<=0なら降順
      while ((x[i] < pivot) && (i <= right))
        i++; // 軸値より大きい要素
      while ((pivot < x[j]) && (i <= right))
        j--; // 軸値より小さい要素
    } else {
      while ((x[i] > pivot) && (i <= right))
        i++; // 軸値より小さい要素
      while ((pivot > x[j]) && (i <= right))
        j--; // 軸値より大きい要素
    }
    if (i >= j)
      break;
    hSwap(x, i, j);
    i++;
    j--;
  }
  // ShowData(x, left, right);

  if (left < i - 1)
    QSort(x, left, i - 1, n);
  if (j + 1 < right)
    QSort(x, j + 1, right, n);
}

void doChangeH(int i, int j) {
  ans[cnt][0] = i;
  ans[cnt][1] = j;
  ans[cnt][2] = i + 1;
  ans[cnt++][3] = j;
  a[i][j]--;
  a[i + 1][j]++;
  f[i] == 0;
  f[i + 1] = 1 - f[i + 1];
}
void doChangeW(int i, int j) {
  ans[cnt][0] = i;
  ans[cnt][1] = j;
  ans[cnt][2] = i;
  ans[cnt++][3] = j + 1;
  a[i][j]--;
  a[i][j + 1]++;
}

int main() {
  int h, w;
  scanf("%d%d", &h, &w);
  int sum;
  REP(i, h) {
    sum = 0;
    REP(j, w) {
      scanf("%d", &a[i][j]);
      sum += a[i][j];
    }
    if (sum % 2 == 1)
      f[i] = 1;
  }
  REP(i, h) {
    if (f[i] == 1 && i != h - 1) {
      REP(j, w) {
        if (a[i][j] % 2 == 1) {
          doChangeH(i, j);
        }
      }
    }
    REP(j, w - 1) {
      if (a[i][j] % 2 == 1) {
        doChangeW(i, j);
      }
    }
  }
  PRINTD(cnt);
  REP(i, cnt) {
    printf("%d %d %d %d\n", ans[i][0] + 1, ans[i][1] + 1, ans[i][2] + 1,
           ans[i][3] + 1);
  }
}

Fixed submission:
#define _CRT_SECURE_NO_WARNINGS

/* include ***********************/
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* define *************************/
// for
#define REP(i, n) for (int i = 0, i##_len = (int)(n); i < i##_len; i++)
#define REPS(i, n) for (int i = 1, i##_len = (int)(n); i <= i##_len; i++)
#define RREP(i, n) for (int i = (int)(n)-1; i >= 0; i--)
#define RREPS(i, n) for (int i = (int)(n); i > 0; i--)
#define FOR(i, s, n)                                                           \
  for (int i = (int)(s), i##_len = (int)(n); i < i##_len; i++)

// printf
#define PRINTD(d) printf("%d\n", (d))
#define PRINTL(d) printf("%lld\n", (d))

// memset
#define m0(s) memset(s, 0, sizeof(s))
#define ml(s) memset(s, 63, sizeof(s))
#define fill(s, c) memset(s, c, sizeof(s))

#define INF 1e9

typedef long long ll;
int cnt = 0;
int ans[300000][4];
int a[500][500];
int f[500] = {0};

int diff[4][2] = {
    {0, -1},
    {-1, 0},
    {1, 0},
    {0, 1},
};

int Min(int a, int b) { return (a) < (b) ? (a) : (b); }
ll Max(ll a, ll b) { return (a) > (b) ? (a) : (b); }
void Swap(int *a, int *b) {
  int tmp = *a;
  *a = *b;
  *b = tmp;
}
void hSwap(int x[], int i, int j) {
  int temp;

  temp = x[i];
  x[i] = x[j];
  x[j] = temp;
}

void ShowData(int x[], int left, int right) {
  int i;
  for (i = left; i <= right; i++)
    printf("%d  ", x[i]);
  printf("\n");
}
void QSort(int x[], int left, int right, int n) {
  int i, j;  // 左端,右端
  int pivot; // 軸

  i = left;
  j = right;
  pivot = x[(left + right) / 2];

  while (1) {
    if (n > 0) { // n>0なら昇順、n<=0なら降順
      while ((x[i] < pivot) && (i <= right))
        i++; // 軸値より大きい要素
      while ((pivot < x[j]) && (i <= right))
        j--; // 軸値より小さい要素
    } else {
      while ((x[i] > pivot) && (i <= right))
        i++; // 軸値より小さい要素
      while ((pivot > x[j]) && (i <= right))
        j--; // 軸値より大きい要素
    }
    if (i >= j)
      break;
    hSwap(x, i, j);
    i++;
    j--;
  }
  // ShowData(x, left, right);

  if (left < i - 1)
    QSort(x, left, i - 1, n);
  if (j + 1 < right)
    QSort(x, j + 1, right, n);
}

void doChangeH(int i, int j) {
  ans[cnt][0] = i;
  ans[cnt][1] = j;
  ans[cnt][2] = i + 1;
  ans[cnt++][3] = j;
  a[i][j]--;
  a[i + 1][j]++;
  f[i] == 0;
  f[i + 1] = 1 - f[i + 1];
}
void doChangeW(int i, int j) {
  ans[cnt][0] = i;
  ans[cnt][1] = j;
  ans[cnt][2] = i;
  ans[cnt++][3] = j + 1;
  a[i][j]--;
  a[i][j + 1]++;
}

int main() {
  int h, w;
  scanf("%d%d", &h, &w);
  int sum;
  REP(i, h) {
    sum = 0;
    REP(j, w) {
      scanf("%d", &a[i][j]);
      sum += a[i][j];
    }
    if (sum % 2 == 1)
      f[i] = 1;
  }
  REP(i, h) {
    if (f[i] == 1 && i != h - 1) {
      REP(j, w) {
        if (a[i][j] % 2 == 1) {
          doChangeH(i, j);
        }
      }
    }
    REP(j, w - 1) {
      if (a[i][j] % 2 == 1) {
        doChangeW(i, j);
      }
    }
  }
  PRINTD(cnt);
  REP(i, cnt) {
    printf("%d %d %d %d\n", ans[i][0] + 1, ans[i][1] + 1, ans[i][2] + 1,
           ans[i][3] + 1);
  }
}