#include <bits/stdc++.h>
using namespace std;
const double g = 10.0, eps = 1e-12;
const int N = 100000 + 10, maxn = 1000 + 10, inf = 0x3f3f3f3f;
int n, m, a[N];
bool vis[N];
inline int myrand() { return rand() * rand() % (n * m) + 1; }
bool ne(int x, int y) {
  if (x + m == y || x - m == y || x + 1 == y || x - 1 == y) return 1;
  return 0;
}
bool solve() {
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      int k = 0;
      while (1) {
        k++;
        if (k >= n * m * 2) return 0;
        int te = (i - 1) * m + j;
        a[te] = myrand();
        if (vis[a[te]])
          ;
        else if (j != 1 && ne(a[te - 1], a[te]))
          ;
        else if (i != 1 && ne(a[te - m], a[te]))
          ;
        else {
          vis[a[te]] = 1;
          break;
        }
      }
    }
  }
  return 1;
}
int main() {
  srand(147);
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= 100; i++) {
    memset(vis, 0, sizeof vis);
    if (solve()) {
      puts("YES");
      for (int j = 1; j <= n; j++) {
        for (int k = 1; k <= m; k++) printf("%d ", a[(j - 1) * m + k]);
        puts("");
      }
      return 0;
    }
  }
  puts("NO");
  return 0;
}
