Problem p03689 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#ifdef LOCAL_DEBUG
#define DEBUG 1
#define CERR                                                                   \
  if (DEBUG)                                                                   \
  cerr
#define MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, NAME, ...) NAME
#define pr(...)                                                                \
  CERR << MACRO(__VA_ARGS__, pr10, pr9, pr8, pr7, pr6, pr5, pr4, pr3, pr2,     \
                pr1)(__VA_ARGS__)                                              \
       << endl
#define pr1(a) (#a) << "=" << (a) << " "
#define pr2(a, b) pr1(a) << pr1(b)
#define pr3(a, b, c) pr1(a) << pr2(b, c)
#define pr4(a, b, c, d) pr1(a) << pr3(b, c, d)
#define pr5(a, b, c, d, e) pr1(a) << pr4(b, c, d, e)
#define pr6(a, b, c, d, e, f) pr1(a) << pr5(b, c, d, e, f)
#define pr7(a, b, c, d, e, f, g) pr1(a) << pr6(b, c, d, e, f, g)
#define pr8(a, b, c, d, e, f, g, h) pr1(a) << pr7(b, c, d, e, f, g, h)
#define pr9(a, b, c, d, e, f, g, h, i) pr1(a) << pr8(b, c, d, e, f, g, h, i)
#define pr10(a, b, c, d, e, f, g, h, i, j)                                     \
  pr1(a) << pr9(b, c, d, e, f, g, h, i, j)
#define prArr(a)                                                               \
  {                                                                            \
    CERR << (#a) << "={";                                                      \
    int i = 0;                                                                 \
    for (auto t : (a))                                                         \
      CERR << (i++ ? ", " : "") << t;                                          \
    CERR << "}" << endl;                                                       \
  }
#else
#define DEBUG 0
#define pr(...)
#define prArr(a)
#endif
using namespace std;
using Int = long long;
using _int = int;
using ll = long long;
using Double = long double;
const Int INF = (1LL << 60) + 1e9; // ~ 1.15 * 1e18
const Int mod = (1e9) + 7;
const Double EPS = 1e-8;
const Double PI = 6.0 * asin((Double)0.5);
using P = pair<Int, Int>;
template <class T> T Max(T &a, T b) { return a = max(a, b); }
template <class T> T Min(T &a, T b) { return a = min(a, b); }
template <class T1, class T2> ostream &operator<<(ostream &o, pair<T1, T2> p) {
  return o << "(" << p.first << "," << p.second << ")";
}
template <class T1, class T2, class T3>
ostream &operator<<(ostream &o, tuple<T1, T2, T3> t) {
  return o << "(" << get<0>(t) << "," << get<1>(t) << "," << get<2>(t) << ")";
}
template <class T1, class T2> istream &operator>>(istream &i, pair<T1, T2> &p) {
  return i >> p.first >> p.second;
}
template <class T> ostream &operator<<(ostream &o, vector<T> a) {
  Int i = 0;
  for (T t : a)
    o << (i++ ? " " : "") << t;
  return o;
}
template <class T> istream &operator>>(istream &i, vector<T> &a) {
  for (T &t : a)
    i >> t;
  return i;
}
// INSERT ABOVE HERE

template <typename T> class CumulativeSum2D {
public:
  Int h, w;
  vector<vector<T>> sum;
  CumulativeSum2D() {}
  CumulativeSum2D(vector<vector<T>> A) {
    assert(A.size());
    h = A.size();
    w = A[0].size();
    sum.resize(h + 1, vector<T>(w + 1));
    for (Int i = 1; i <= h; i++)
      for (Int j = 1; j <= w; j++)
        sum[i][j] += sum[i][j - 1] + A[i - 1][j - 1];

    for (Int j = 1; j <= w; j++)
      for (Int i = 1; i <= h; i++)
        sum[i][j] += sum[i - 1][j];
  }

  // 半開区間
  T get(Int x, Int y, Int X, Int Y) {
    assert(x <= X && y <= Y);
    assert(0 <= x && x <= w && 0 <= X && x <= w);
    assert(0 <= y && y <= h && 0 <= Y && Y <= h);
    return sum[Y][X] - sum[y][X] - sum[Y][x] + sum[y][x];
  }
};

class Rotation {
public:
  // 時計回りに90度回転
  template <class T> static vector<T> rot90(const vector<T> &v) {
    Int h = v.size(), w = v[0].size();
    vector<T> res(w, T(h, 0));
    for (Int i = 0; i < h; i++)
      for (Int j = 0; j < w; j++)
        res[j][h - i - 1] = v[i][j];
    return res;
  }

  // 反時計回りに90度回転
  template <class T> static vector<T> rrot90(const vector<T> &v) {
    Int h = v.size(), w = v[0].size();
    vector<T> res(w, T(h, 0));
    for (Int i = 0; i < h; i++)
      for (Int j = 0; j < w; j++)
        res[w - 1 - j][i] = v[i][j];
    return res;
  }
};

vector<vector<Int>> calc(Int H, Int W, Int h, Int w, vector<vector<Int>> ans) {
  for (Int i = 0; i < H; i++) {
    Int s = 0;
    for (Int j = 0; j < W; j++) {
      s += ans[i][j];
      if (j - w >= 0)
        s -= ans[i][j - w];
      if (j % w != w - 1)
        continue;
      if (s < 0)
        continue;
      s -= ans[i][j];
      ans[i][j] = -s - 1;
      s += ans[i][j];
    }
  }
  return ans;
}

signed main() {
  srand((unsigned)time(NULL));
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  cout << fixed << setprecision(12);

  Int H, W, h, w;
  cin >> H >> W >> h >> w;

  if (H % h == 0 && W % w == 0) {
    cout << "No" << endl;
    return 0;
  }

  Int swaped = 0;
  if (W % w == 0)
    swap(H, W), swap(h, w), swaped = 1;
  vector<vector<Int>> ans(H, vector<Int>(W, 1e8));

  ans = calc(H, W, h, w, ans);
  for (Int i = 0; i < H; i++)
    reverse(ans[i].begin(), ans[i].end());
  ans = calc(H, W, h, w, ans);

  if (swaped) {
    swap(H, W);
    swap(h, w);
    ans = Rotation::rot90(ans);
  }

  CumulativeSum2D<Int> S(ans);
  assert(S.get(0, 0, W, H) > 0);

  for (Int i = 0; i < H; i++)
    for (Int j = 0; j < W; j++) {
      if (i + h > H || j + w > W)
        continue;
      Int s = S.get(j, i, j + w, i + h);
      assert(s < 0);
    }

  for (Int i = 0; i < H; i++)
    for (Int j = 0; j < W; j++)
      assert(-1e9 <= ans[i][j] && ans[i][j] <= 1e9);

  cout << "Yes" << endl;
  for (Int i = 0; i < H; i++)
    cout << ans[i] << endl;

  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
#ifdef LOCAL_DEBUG
#define DEBUG 1
#define CERR                                                                   \
  if (DEBUG)                                                                   \
  cerr
#define MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, NAME, ...) NAME
#define pr(...)                                                                \
  CERR << MACRO(__VA_ARGS__, pr10, pr9, pr8, pr7, pr6, pr5, pr4, pr3, pr2,     \
                pr1)(__VA_ARGS__)                                              \
       << endl
#define pr1(a) (#a) << "=" << (a) << " "
#define pr2(a, b) pr1(a) << pr1(b)
#define pr3(a, b, c) pr1(a) << pr2(b, c)
#define pr4(a, b, c, d) pr1(a) << pr3(b, c, d)
#define pr5(a, b, c, d, e) pr1(a) << pr4(b, c, d, e)
#define pr6(a, b, c, d, e, f) pr1(a) << pr5(b, c, d, e, f)
#define pr7(a, b, c, d, e, f, g) pr1(a) << pr6(b, c, d, e, f, g)
#define pr8(a, b, c, d, e, f, g, h) pr1(a) << pr7(b, c, d, e, f, g, h)
#define pr9(a, b, c, d, e, f, g, h, i) pr1(a) << pr8(b, c, d, e, f, g, h, i)
#define pr10(a, b, c, d, e, f, g, h, i, j)                                     \
  pr1(a) << pr9(b, c, d, e, f, g, h, i, j)
#define prArr(a)                                                               \
  {                                                                            \
    CERR << (#a) << "={";                                                      \
    int i = 0;                                                                 \
    for (auto t : (a))                                                         \
      CERR << (i++ ? ", " : "") << t;                                          \
    CERR << "}" << endl;                                                       \
  }
#else
#define DEBUG 0
#define pr(...)
#define prArr(a)
#endif
using namespace std;
using Int = long long;
using _int = int;
using ll = long long;
using Double = long double;
const Int INF = (1LL << 60) + 1e9; // ~ 1.15 * 1e18
const Int mod = (1e9) + 7;
const Double EPS = 1e-8;
const Double PI = 6.0 * asin((Double)0.5);
using P = pair<Int, Int>;
template <class T> T Max(T &a, T b) { return a = max(a, b); }
template <class T> T Min(T &a, T b) { return a = min(a, b); }
template <class T1, class T2> ostream &operator<<(ostream &o, pair<T1, T2> p) {
  return o << "(" << p.first << "," << p.second << ")";
}
template <class T1, class T2, class T3>
ostream &operator<<(ostream &o, tuple<T1, T2, T3> t) {
  return o << "(" << get<0>(t) << "," << get<1>(t) << "," << get<2>(t) << ")";
}
template <class T1, class T2> istream &operator>>(istream &i, pair<T1, T2> &p) {
  return i >> p.first >> p.second;
}
template <class T> ostream &operator<<(ostream &o, vector<T> a) {
  Int i = 0;
  for (T t : a)
    o << (i++ ? " " : "") << t;
  return o;
}
template <class T> istream &operator>>(istream &i, vector<T> &a) {
  for (T &t : a)
    i >> t;
  return i;
}
// INSERT ABOVE HERE

template <typename T> class CumulativeSum2D {
public:
  Int h, w;
  vector<vector<T>> sum;
  CumulativeSum2D() {}
  CumulativeSum2D(vector<vector<T>> A) {
    assert(A.size());
    h = A.size();
    w = A[0].size();
    sum.resize(h + 1, vector<T>(w + 1));
    for (Int i = 1; i <= h; i++)
      for (Int j = 1; j <= w; j++)
        sum[i][j] += sum[i][j - 1] + A[i - 1][j - 1];

    for (Int j = 1; j <= w; j++)
      for (Int i = 1; i <= h; i++)
        sum[i][j] += sum[i - 1][j];
  }

  // 半開区間
  T get(Int x, Int y, Int X, Int Y) {
    assert(x <= X && y <= Y);
    assert(0 <= x && x <= w && 0 <= X && x <= w);
    assert(0 <= y && y <= h && 0 <= Y && Y <= h);
    return sum[Y][X] - sum[y][X] - sum[Y][x] + sum[y][x];
  }
};

class Rotation {
public:
  // 時計回りに90度回転
  template <class T> static vector<T> rot90(const vector<T> &v) {
    Int h = v.size(), w = v[0].size();
    vector<T> res(w, T(h, 0));
    for (Int i = 0; i < h; i++)
      for (Int j = 0; j < w; j++)
        res[j][h - i - 1] = v[i][j];
    return res;
  }

  // 反時計回りに90度回転
  template <class T> static vector<T> rrot90(const vector<T> &v) {
    Int h = v.size(), w = v[0].size();
    vector<T> res(w, T(h, 0));
    for (Int i = 0; i < h; i++)
      for (Int j = 0; j < w; j++)
        res[w - 1 - j][i] = v[i][j];
    return res;
  }
};

vector<vector<Int>> calc(Int H, Int W, Int h, Int w, vector<vector<Int>> ans) {
  for (Int i = 0; i < H; i++) {
    Int s = 0;
    for (Int j = 0; j < W; j++) {
      s += ans[i][j];
      if (j - w >= 0)
        s -= ans[i][j - w];
      if (j % w != w - 1)
        continue;
      if (s < 0)
        continue;
      s -= ans[i][j];
      ans[i][j] = -s - 1;
      s += ans[i][j];
    }
  }
  return ans;
}

signed main() {
  srand((unsigned)time(NULL));
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  cout << fixed << setprecision(12);

  Int H, W, h, w;
  cin >> H >> W >> h >> w;

  if (H % h == 0 && W % w == 0) {
    cout << "No" << endl;
    return 0;
  }

  Int swaped = 0;
  if (W % w == 0)
    swap(H, W), swap(h, w), swaped = 1;
  vector<vector<Int>> ans(H, vector<Int>(W, 1e6));

  ans = calc(H, W, h, w, ans);
  for (Int i = 0; i < H; i++)
    reverse(ans[i].begin(), ans[i].end());
  ans = calc(H, W, h, w, ans);

  if (swaped) {
    swap(H, W);
    swap(h, w);
    ans = Rotation::rot90(ans);
  }

  CumulativeSum2D<Int> S(ans);
  assert(S.get(0, 0, W, H) > 0);

  for (Int i = 0; i < H; i++)
    for (Int j = 0; j < W; j++) {
      if (i + h > H || j + w > W)
        continue;
      Int s = S.get(j, i, j + w, i + h);
      assert(s < 0);
    }

  for (Int i = 0; i < H; i++)
    for (Int j = 0; j < W; j++)
      assert(-1e9 <= ans[i][j] && ans[i][j] <= 1e9);

  cout << "Yes" << endl;
  for (Int i = 0; i < H; i++)
    cout << ans[i] << endl;

  return 0;
}