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 Java8 (OpenJDK 1.8.0) (judge verdict: Wrong Answer)

import java.util.*;
import java.io.*;
import java.math.*;

public class Main{

  public static boolean checkKernel(long[][] rect, long H, long W, long h, long w){
    for(int i=0;i<H-h+1;i++){
      for(int j=0;j<W-w+1;j++){
        long sum = 0;
        for(int k=i;k<i+h;k++){
          for(int l=j;l<j+w;l++){
            sum+=rect[k][l];
          }
        }
        if (sum>=0) {
          return false;
        }
      }
    }
    return true;
  }

  public static void main(String[] args) throws IOException{
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

    Integer[] HWhw = Arrays.stream(in.readLine().split(" ")).map(Integer::parseInt).toArray(Integer[]::new);

    int H = HWhw[0];
    int W = HWhw[1];
    int h = HWhw[2];
    int w = HWhw[3];

    long[][] rect = new long[H][W];
    long[][] kernel = new long[h][w];

    rect[H/2][W/2]=1;

    long[][] gauss = new long[H][W];

    for(int i=0;i<H-h+1;i++){
      for(int j=0;j<W-w+1;j++){
        for(int k=i;k<i+h;k++){
          for(int l=j;l<j+w;l++){
            gauss[k][l]++;
          }
        }
      }
    }

    for(int i=0;i<H-h+1;i++){
      for(int j=0;j<W-w+1;j++){
        for(int k=i;k<i+h;k++){
          for(int l=j;l<j+w;l++){
            for(int m=i;m<i+h;m++){
              for(int n=j;n<j+w;n++){
                if(gauss[m][n]<gauss[k][l]){
                  rect[m][n]++;
                  rect[k][l]--;
                }
              }
            }
          }
        }
      }
    }

    if (checkKernel(rect, H, W, h, w)) {
      System.out.println("Yes");
      for(int i=0;i<H;i++){
        for(int j=0;j<W;j++){
          System.out.print(rect[i][j]+" ");
        }
        System.out.println();
      }
    }else{
      System.out.println("No");
    }
  }
}