#include <bits/stdc++.h>
using namespace std;
int n, m, mn, mx, mid;
int** a;
int b[100005];
bool fg;
inline int read() {
  int n = 0, f = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    n = n * 10 + c - '0';
    c = getchar();
  }
  return n * f;
}
int main() {
  register int i, j;
  n = read();
  m = read();
  mn = min(n, m);
  mx = max(n, m);
  if (mn == 1 && mx == 1) return 0 * printf("YES\n1");
  if (mn == 1 && mx <= 3) return 0 * printf("NO");
  if (mn == 2 && mx <= 3) return 0 * printf("NO");
  if (mn == 3 && mx == 3) return 0 * printf("YES\n5 3 9\n1 8 2\n7 6 4");
  if (n <= m) {
    a = new int*[n + 5];
    for (i = 1; i <= n; ++i) a[i] = new int[m + 5];
    for (i = 1; i <= n; ++i)
      for (j = 1; j <= m; ++j) a[i][j] = (i - 1) * m + j;
  } else {
    swap(n, m);
    fg = true;
    a = new int*[n + 5];
    for (i = 1; i <= n; ++i) a[i] = new int[m + 5];
    for (i = 1; i <= m; ++i)
      for (j = 1; j <= n; ++j) a[j][i] = (i - 1) * n + j;
  }
  mid = m >> 1;
  for (i = 1; i <= n; ++i) {
    if (m & 1) {
      for (j = 1; j < m; ++j)
        if (j <= mid)
          b[(i & 1) + (j * 2)] = a[i][j];
        else
          b[(i & 1) + ((j - mid) * 2 - 1)] = a[i][j];
      if (i & 1)
        b[1] = a[i][m];
      else
        b[m] = a[i][m];
    } else {
      for (j = 1; j <= m; ++j)
        if (j <= mid)
          b[(j * 2)] = a[i][j];
        else
          b[((j - mid) * 2 - 1)] = a[i][j];
      if (i & 1)
        for (j = 1; j <= mid; ++j) swap(b[j], b[m - j + 1]);
    }
    for (j = 1; j <= m; ++j) a[i][j] = b[j];
  }
  puts("YES");
  if (fg)
    for (i = 1; i <= m; ++i, puts(""))
      for (j = 1; j <= n; ++j) printf("%d ", a[j][i]);
  else
    for (i = 1; i <= n; ++i, puts(""))
      for (j = 1; j <= m; ++j) printf("%d ", a[i][j]);
}
