#include <bits/stdc++.h>
using namespace std;
const int N = 1e5;
vector<int> v[N];
vector<int> w[N];
int n, m;
int g[4] = {-1, 0, 0, 1};
int h[4] = {0, -1, 1, 0};
bool check(int i, int j) { return i >= 0 && i < n && j >= 0 && j < m; }
bool f(int i, int j) {
  if (i > j) swap(i, j);
  if (i / m == j / m && i % m + 1 == j % m) return false;
  if (i % m == j % m && i / m + 1 == j / m) return false;
  return true;
}
int main() {
  srand(time(NULL));
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int t = clock();
  cin >> n >> m;
  for (int i = 0; i < n; i++) v[i].resize(m);
  for (int i = 0; i < n; i++) w[i].resize(m);
  if (m >= 8) {
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        if (i % 2 == 0)
          w[i][j] = i * m + j;
        else
          w[i][(j + 1) % m] = i * m + j;
      }
    }
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        if (j % 2 == 0) {
          if (m % 2 == 0 || j + 4 < m)
            v[i][(j + 4) % m] = w[i][j];
          else if (j == m - 1)
            v[i][2] = w[i][j];
          else if (j == m - 3)
            v[i][0] = w[i][j];
        } else
          v[i][j] = w[i][j];
      }
    }
    cout << "YES\n";
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) cout << v[i][j] + 1 << " ";
      cout << endl;
    }
    return 0;
  }
  if (n >= 8) {
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        if (j % 2 == 0)
          w[i][j] = i * m + j;
        else
          w[(i + 1) % n][j] = i * m + j;
      }
    }
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        if (i % 2 == 0) {
          if (n % 2 == 0 || i + 4 < n)
            v[(i + 4) % n][j] = w[i][j];
          else if (i == n - 1)
            v[2][j] = w[i][j];
          else if (i == n - 3)
            v[0][j] = w[i][j];
        } else
          v[i][j] = w[i][j];
      }
    }
    cout << "YES\n";
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) cout << v[i][j] + 1 << " ";
      cout << endl;
    }
    return 0;
  }
  vector<int> q;
  for (int i = 0; i < n * m; i++) q.push_back(i);
  while (clock() - t < 1.5 * CLOCKS_PER_SEC) {
    random_shuffle(q.begin(), q.end());
    for (int i = 0; i < n * m; i++) {
      v[i / m][i % m] = q[i];
    }
    bool cor = true;
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        for (int k = 0; k < 4; k++) {
          int a = i + g[k];
          int b = j + h[k];
          if (check(a, b)) {
            if (!f(v[i][j], v[a][b])) cor = false;
          }
        }
      }
    }
    if (cor) {
      cout << "YES\n";
      for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) cout << v[i][j] + 1 << " ";
        cout << endl;
      }
      return 0;
    }
  }
  cout << "NO\n";
  return 0;
}
