Problem:
Score : 700 points

Problem Statement

You are given four integers: H, W, h and w (1 ≤ h ≤ H, 1 ≤ w ≤ W).
Determine whether there exists a matrix such that all of the following conditions are held, and construct one such matrix if the answer is positive:

The matrix has H rows and W columns.

Each element of the matrix is an integer between -10^9 and 10^9 (inclusive).

The sum of all the elements of the matrix is positive.

The sum of all the elements within every subrectangle with h rows and w columns in the matrix is negative.

Constraints

1 ≤ h ≤ H ≤ 500

1 ≤ w ≤ W ≤ 500

Input

Input is given from Standard Input in the following format:

H W h w

Output

If there does not exist a matrix that satisfies all of the conditions, print No.

Otherwise, print Yes in the first line, and print a matrix in the subsequent lines in the following format:

a_{11} ... a_{1W}
:
a_{H1} ... a_{HW}

Here, a_{ij} represents the (i,\ j) element of the matrix.

Sample Input 1

3 3 2 2

Sample Output 1

Yes
1 1 1
1 -4 1
1 1 1

The sum of all the elements of this matrix is 4, which is positive.
Also, in this matrix, there are four subrectangles with 2 rows and 2 columns as shown below. For each of them, the sum of all the elements inside is -1, which is negative.

Sample Input 2

2 4 1 2

Sample Output 2

No

Sample Input 3

3 4 2 3

Sample Output 3

Yes
2 -5 8 7
3 -5 -4 -5
2 1 -1 7

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
#define REP(i,n) for(int i=0,_n=(int)(n);i<_n;++i)
template<class T>bool chmin(T&a,const T&b){return a>b?(a=b,true):false;}
template<class T>bool chmax(T&a,const T&b){return a<b?(a=b,true):false;}

int nextInt() {
  int x; scanf("%d", &x); return x;
}

ll t[512][512];
ll acm[512][512];

int H, W, h, w;

ll range(int r1, int c1, int r2, int c2) {
  return acm[r2][c2] - acm[r1][c2] - acm[r2][c1] + acm[r1][c1];
}

bool check() {
  memset(acm, 0, sizeof(acm));
  REP(i, H) REP(j, W) {
    acm[i+1][j+1] = -acm[i][j] + acm[i+1][j] + acm[i][j+1] + t[i][j];
  }
  if (range(0, 0, H, W) <= 0) return false;
  REP(i, H - h + 1) REP(j, W - w + 1) {
    if (range(i, j, i + h, j + w) >= 0) return false;
  }
  return true;
}

int main2() {
  H = nextInt();
  W = nextInt();
  h = nextInt();
  w = nextInt();

  if (h * w == 1) {
    cout << "No" << endl;
    return 0;
  }

  ll BIG = (ll)1e9;
  memset(t, -1, sizeof(t));
  REP(i, H) REP(j, W) {
    ll p = h * w - 1;
    t[i][j] = -((BIG + 1 + p - 1) / p);
  }

  for (int i = 0; i < H; i += h) {
    for (int j = 0; j < W; j += w) {
      t[i][j] = BIG;
    }
  }
  if (check()) {
    cout << "Yes" << endl;
    REP(i, H) {
      REP(j, W) {
        if (j > 0) printf(" ");
        printf("%d", t[i][j]);
      }
      printf("\n");
    }
  } else {
    cout << "No" << endl;
  }
  return 0;
}

int main() {
  for (;!cin.eof();cin>>ws) main2();
  return 0;
}