Problem p03263 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
// #include <boost/multiprecision/cpp_int.hpp>
using namespace std;
// using namespace boost::multiprecision;
typedef long long int ll;
typedef long double ld;
#define MOD 1000000007
#define ALL(obj) (obj).begin(), (obj).end()
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
const long long INF = 1LL << 60;
bool pairCompare(const pair<double, ll> &firstElof,
                 const pair<double, ll> &secondElof) {
  return firstElof.first < secondElof.first;
}
bool pairCompareSecond(const pair<double, ll> &firstElof,
                       const pair<double, ll> &secondElof) {
  return firstElof.second < secondElof.second;
}
// 四方向への移動ベクトル
const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};

struct edge { // グラフに使うヤツ
  ll from, to, cost;
};

typedef vector<vector<edge>> G;
ll gcd(ll a, ll b) {
  if (a % b == 0)
    return (b);
  else
    return (gcd(b, a % b));
}

int main() {
  ll h, w;
  cin >> h >> w;
  ll a[h][w];
  for (ll i = 0; i < h; i++) {
    for (ll j = 0; j < w; j++) {
      cin >> a[i][j];
    }
  }
  vector<pair<pair<ll, ll>, pair<ll, ll>>> ans;
  for (ll i = 0; i < w; i++) {
    if (i % 2) {
      for (ll j = h - 1; j >= 0; j--) {
        if (i == w - 1 and j == 0)
          break;
        if (a[j][i] % 2) {
          pair<ll, ll> p1, p2;
          p1 = make_pair(j, i);
          a[j][i]--;
          if (j == 0) {
            p2 = make_pair(j, i + 1);
            a[j][i + 1]++;
          } else {
            p2 = make_pair(j + 1, i);
            a[j + 1][i]++;
          }
          ans.push_back(make_pair(p1, p2));
        }
      }
    } else {
      for (ll j = 0; j < h; j++) {
        if (i == w - 1 and j == h - 1)
          break;
        if (a[j][i] % 2) {
          pair<ll, ll> p1, p2;
          p1 = make_pair(j, i);
          a[j][i]--;
          if (j == h - 1) {
            p2 = make_pair(j, i + 1);
            a[j][i + 1]++;
          } else {
            p2 = make_pair(j + 1, i);
            a[j + 1][i]++;
          }
          ans.push_back(make_pair(p1, p2));
        }
      }
    }
  }
  cout << ans.size() << endl;
  for (ll i = 0; i < ans.size(); i++) {
    pair<ll, ll> p1, p2;
    p1 = ans[i].first;
    p2 = ans[i].second;
    cout << p1.first + 1 << " " << p1.second + 1 << " " << p2.first + 1 << " "
         << p2.second + 1 << endl;
  }
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
// #include <boost/multiprecision/cpp_int.hpp>
using namespace std;
// using namespace boost::multiprecision;
typedef long long int ll;
typedef long double ld;
#define MOD 1000000007
#define ALL(obj) (obj).begin(), (obj).end()
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
const long long INF = 1LL << 60;
bool pairCompare(const pair<double, ll> &firstElof,
                 const pair<double, ll> &secondElof) {
  return firstElof.first < secondElof.first;
}
bool pairCompareSecond(const pair<double, ll> &firstElof,
                       const pair<double, ll> &secondElof) {
  return firstElof.second < secondElof.second;
}
// 四方向への移動ベクトル
const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};

struct edge { // グラフに使うヤツ
  ll from, to, cost;
};

typedef vector<vector<edge>> G;
ll gcd(ll a, ll b) {
  if (a % b == 0)
    return (b);
  else
    return (gcd(b, a % b));
}

int main() {
  ll h, w;
  cin >> h >> w;
  ll a[h][w];
  for (ll i = 0; i < h; i++) {
    for (ll j = 0; j < w; j++) {
      cin >> a[i][j];
    }
  }
  vector<pair<pair<ll, ll>, pair<ll, ll>>> ans;
  for (ll i = 0; i < w; i++) {
    if (i % 2) {
      for (ll j = h - 1; j >= 0; j--) {
        if (i == w - 1 and j == 0)
          break;
        if (a[j][i] % 2) {
          pair<ll, ll> p1, p2;
          p1 = make_pair(j, i);
          a[j][i]--;
          if (j == 0) {
            p2 = make_pair(j, i + 1);
            a[j][i + 1]++;
          } else {
            p2 = make_pair(j - 1, i);
            a[j - 1][i]++;
          }
          ans.push_back(make_pair(p1, p2));
        }
      }
    } else {
      for (ll j = 0; j < h; j++) {
        if (i == w - 1 and j == h - 1)
          break;
        if (a[j][i] % 2) {
          pair<ll, ll> p1, p2;
          p1 = make_pair(j, i);
          a[j][i]--;
          if (j == h - 1) {
            p2 = make_pair(j, i + 1);
            a[j][i + 1]++;
          } else {
            p2 = make_pair(j + 1, i);
            a[j + 1][i]++;
          }
          ans.push_back(make_pair(p1, p2));
        }
      }
    }
  }
  cout << ans.size() << endl;
  for (ll i = 0; i < ans.size(); i++) {
    pair<ll, ll> p1, p2;
    p1 = ans[i].first;
    p2 = ans[i].second;
    cout << p1.first + 1 << " " << p1.second + 1 << " " << p2.first + 1 << " "
         << p2.second + 1 << endl;
  }
  return 0;
}