#include <bits/stdc++.h>
using namespace std;
const long long MAXN = 1e6 + 7;
long long n, m;
vector<long long> ans[MAXN], pos[2];
inline long long p(long long i, long long j) { return i * m + j + 1; }
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  long long mx = max(n, m), mn = min(n, m);
  if (mx == 1) return cout << "YES\n1\n", 0;
  if (mx <= 2) return cout << "NO\n", 0;
  if (mx == 3) {
    if (mn <= 2)
      return cout << "NO\n", 0;
    else
      return cout << "YES\n6 1 8\n7 5 3\n2 9 4\n", 0;
  }
  cout << "YES\n";
  if (m < 4) {
    for (long long i = 0; i < n; i++) pos[!(i % 2)].push_back(i);
    for (long long i = 0; i < n; i++) pos[(i % 2)].push_back(i);
    if (n == 4) {
      pos[0].clear();
      pos[0].push_back(2);
      pos[0].push_back(0);
      pos[0].push_back(3);
      pos[0].push_back(1);
      pos[1].clear();
      pos[1].push_back(1);
      pos[1].push_back(3);
      pos[1].push_back(0);
      pos[1].push_back(2);
    }
    for (long long i = 0; i < m; i++)
      for (long long j = 0; j < n; j++) ans[i].push_back(p(pos[i % 2][j], i));
    for (long long i = 0; i < n; i++) {
      for (long long j = 0; j < m; j++) cout << ans[j][i] << " ";
      cout << endl;
    }
    return 0;
  }
  for (long long i = 0; i < m; i++) pos[!(i % 2)].push_back(i);
  for (long long i = 0; i < m; i++) pos[(i % 2)].push_back(i);
  if (m == 4) {
    pos[0].clear();
    pos[0].push_back(2);
    pos[0].push_back(0);
    pos[0].push_back(3);
    pos[0].push_back(1);
    pos[1].clear();
    pos[1].push_back(1);
    pos[1].push_back(3);
    pos[1].push_back(0);
    pos[1].push_back(2);
  }
  for (long long i = 0; i < n; i++) {
    for (long long j = 0; j < m; j++) cout << p(i, pos[i % 2][j]) << " ";
    cout << endl;
  }
}
