#include <bits/stdc++.h>
#pragma GCC target("avx2")
#pragma GCC optimization("O3")
#pragma GCC optimization("unroll-loops")
using namespace std;
int64_t fx[4] = {0, 1, 0, -1};
int64_t fy[4] = {1, 0, -1, 0};
const long long M = 2e5 + 10, M2 = 1e6 + 10, oo = 1e9 + 7, mod = 998244353;
const long long MC = (1 << 22) + 5;
void precomp() {}
void solve() {
  int64_t n, m;
  cin >> n >> m;
  if (n == 1 && m == 1) {
    cout << "YES" << '\n';
    cout << 1 << '\n';
    return;
  }
  int64_t swapped = 0;
  if (n == 3 && m == 3) {
    cout << "YES" << '\n';
    cout << 5 << " " << 1 << " " << 8 << '\n';
    cout << 3 << " " << 7 << " " << 6 << '\n';
    cout << 9 << " " << 2 << " " << 4 << '\n';
    return;
  }
  if (n > m) {
    swap(n, m);
    swapped = 1;
  }
  int64_t nara[n + 1][m + 1];
  for (int64_t i = 0; i < n; i++) {
    for (int64_t j = 0; j < m; j++) {
      nara[i][j] = (i * m + j + 1);
    }
  }
  if (swapped) {
    for (int64_t i = 0; i < n; i++) {
      for (int64_t j = 0; j < m; j++) {
        nara[i][j] = j * n + i + 1;
      }
    }
  }
  if (m < 4) {
    cout << "NO" << '\n';
    return;
  }
  cout << "YES" << '\n';
  int64_t ara[n + 1][m + 1];
  for (int64_t i = 0; i < n; i++) {
    int64_t nm = m - 2;
    int64_t j = 0;
    for (j = 0;; j++) {
      ara[i][j] = nara[i][nm];
      nm -= 2;
      if (nm < 0) break;
    }
    j++;
    nm = m - 1;
    for (; j < m; j++) {
      ara[i][j] = nara[i][nm];
      nm -= 2;
    }
    if (i % 2 == 1) {
      reverse(ara[i], ara[i] + m);
      if (m % 2 == 1) {
        swap(ara[i][m / 2], ara[i][(m / 2 + 1)]);
      }
    }
  }
  if (swapped) {
    for (int64_t i = 0; i < m; i++) {
      for (int64_t j = 0; j < n; j++) {
        cout << ara[j][i] << " ";
      }
      cout << '\n';
    }
    return;
  }
  for (int64_t i = 0; i < n; i++) {
    for (int64_t j = 0; j < m; j++) {
      cout << ara[i][j] << " ";
    }
    cout << '\n';
  }
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  precomp();
  solve();
  return 0;
}
