#include <bits/stdc++.h>
using namespace std;
const long long maxn = 2e5 + 7;
long long n, m;
vector<long long> adj[maxn];
vector<long long> arr[maxn], cur[maxn];
bool used[maxn];
long long dx[] = {0, 0, -1, 1};
long long dy[] = {1, -1, 0, 0};
long long myrand() {
  long long x = ((1LL * rand() * (1LL << 20) + rand()) % (n * m)) + 1;
  return x;
}
bool check(long long x, long long i, long long j) {
  if (i <= 0 || j <= 0) return 0;
  for (long long v : adj[x]) {
    if (v == cur[i][j]) return 1;
  }
  return 0;
}
void solve() {
  long long num = 0;
  for (long long i = 1; i <= n; i++) {
    for (long long j = 1; j <= m; j++) {
      num = 0;
      long long x = myrand();
      while ((num < (n * m + 1000)) &&
             (used[x] == 1 || check(x, i - 1, j) || check(x, i, j - 1))) {
        x = myrand();
        num++;
      }
      if (num >= (n * m + 1000)) return;
      used[x] = 1;
      cur[i][j] = x;
    }
  }
  cout << "YES" << '\n';
  for (long long i = 1; i <= n; i++) {
    for (long long j = 1; j <= m; j++) {
      printf("%d ", cur[i][j]);
    }
    cout << '\n';
  }
  exit(0);
}
int32_t main() {
  srand(44);
  cin >> n >> m;
  for (long long i = 1; i <= n; i++) {
    arr[i].resize(m + 10);
    cur[i].resize(m + 10);
    for (long long j = 1; j <= m; j++) arr[i][j] = (i - 1) * m + j;
  }
  for (long long i = 1; i <= n; i++) {
    for (long long j = 1; j <= m; j++) {
      for (long long k = 0; k < 4; k++) {
        long long nx = i + dx[k];
        long long ny = j + dy[k];
        if (nx >= 1 && nx <= n && ny >= 1 && ny <= m)
          adj[arr[i][j]].push_back(arr[nx][ny]);
      }
    }
  }
  for (long long i = 0; i < 70; i++) {
    memset(used, 0, sizeof(used));
    solve();
  }
  cout << "NO";
  return 0;
}
