#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
const int arr = 2e5 + 10;
const int ar = 2e3 + 10;
const long double pi = acos(-1);
const long double eps = 1e-10;
const long long md = 1e9 + 7;
int sz;
pair<int, int> bad[10 * arr];
bool badly(pair<int, int> cur) {
  if (*lower_bound(bad, bad + sz, cur) == cur) {
    return 1;
  }
  return 0;
}
bool ok(vector<int>& kek, int n, int m) {
  vector<vector<int> > st(n, vector<int>(m, 0));
  int p = 0;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      st[i][j] = kek[p++];
    }
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (i != 0) {
        if (badly({st[i][j], st[i - 1][j]})) {
          return 0;
        }
        if (badly({st[i - 1][j], st[i][j]})) {
          return 0;
        }
      }
      if (j != 0) {
        if (badly({st[i][j], st[i][j - 1]})) {
          return 0;
        }
        if (badly({st[i][j - 1], st[i][j]})) {
          return 0;
        }
      }
      if (i != n - 1) {
        if (badly({st[i][j], st[i + 1][j]})) {
          return 0;
        }
        if (badly({st[i + 1][j], st[i][j]})) {
          return 0;
        }
      }
      if (j != m - 1) {
        if (badly({st[i][j], st[i][j + 1]})) {
          return 0;
        }
        if (badly({st[i][j + 1], st[i][j]})) {
          return 0;
        }
      }
    }
  }
  return 1;
}
int main() {
  srand(time(0));
  auto start = clock();
  int n, m;
  cin >> n >> m;
  if (n + m == 3) {
    return cout << "NO"
                << "\n",
           0;
  }
  vector<vector<int> > st(n, vector<int>(m, 0));
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      st[i][j] = i * m + j + 1;
    }
  }
  if (n >= 6 && m >= 6) {
    cout << "YES"
         << "\n";
    vector<int> a1(0);
    vector<int> a2(0);
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        if ((i + j) % 2 == 0) {
          a1.push_back(st[i][j]);
        } else {
          a2.push_back(st[i][j]);
        }
      }
    }
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        if (!a1.empty()) {
          cout << a1.back() << " ";
          a1.pop_back();
        } else {
          cout << a2.back() << " ";
          a2.pop_back();
        }
      }
      cout << "\n";
    }
    return 0;
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (i != 0) {
        bad[sz++] = {st[i][j], st[i - 1][j]};
        bad[sz++] = {st[i - 1][j], st[i][j]};
      }
      if (j != 0) {
        bad[sz++] = {st[i][j], st[i][j - 1]};
        bad[sz++] = {st[i][j - 1], st[i][j]};
      }
      if (i != n - 1) {
        bad[sz++] = {st[i][j], st[i + 1][j]};
        bad[sz++] = {st[i + 1][j], st[i][j]};
      }
      if (j != m - 1) {
        bad[sz++] = {st[i][j], st[i][j + 1]};
        bad[sz++] = {st[i][j + 1], st[i][j]};
      }
    }
  }
  bad[sz++] = {md, md};
  sort(bad, bad + sz);
  for (int i = 0; i < sz; i++) {
  }
  vector<int> kek(0);
  for (int i = 1; i <= n * m; i++) {
    kek.push_back(i);
  }
  while ((clock() - start) / CLOCKS_PER_SEC <= 1.5) {
    random_shuffle(kek.begin(), kek.end());
    if (ok(kek, n, m)) {
      cout << "YES"
           << "\n";
      for (int i = 1; i <= n * m; i++) {
        cout << kek[i - 1] << " ";
        if (i % m == 0) {
          cout << "\n";
        }
      }
      return 0;
    }
  }
  cout << "NO"
       << "\n";
}
