#include <bits/stdc++.h>
using namespace std;
int n, m, chg;
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m;
  chg = 0;
  if (n == 1 && m == 1)
    cout << "YES\n1" << endl;
  else if (n <= 2 && m <= 2)
    cout << "NO" << endl;
  else if (n == 3 && m <= 2)
    cout << "NO" << endl;
  else if (n <= 2 && m == 3)
    cout << "NO" << endl;
  else if (n == 3 && m == 3)
    cout << "YES" << endl << "1 7 5\n6 2 9\n8 4 3" << endl;
  else if (n == 4 && m == 1)
    cout << "YES\n2\n4\n1\n3" << endl;
  else if (n == 1 && m == 4)
    cout << "YES\n2 4 1 3" << endl;
  else if (m == 1 || n == 1) {
    cout << "YES" << endl;
    if (n == 1) swap(n, m), chg = 1;
    int p[n], j = 0;
    for (int i = 0; i < n; i += 2, j++) p[j] = i;
    for (int i = 1; i < n; i += 2, j++) p[j] = i;
    if (chg) {
      for (int i = 0; i < n; i++) cout << p[i] + 1 << " ";
      cout << endl;
    } else {
      for (int i = 0; i < n; i++) cout << p[i] + 1 << endl;
    }
  } else if ((n % 2 == 0 || m % 2 == 0) &&
             !((m == 2 && n % 2 != 0) || (n == 2 && m % 2 != 0))) {
    cout << "YES" << endl;
    if (n == 2 || n % 2 != 0) swap(n, m), chg = 1;
    int cnt = 1, mat[n][m];
    for (int i = 0; i < m / 2; i++) {
      for (int j = 0, k = 1, k2 = 1; j < n; j++, cnt++, k = !k, k2 = -k2)
        mat[j + k2][k + 2 * i] = cnt;
      for (int j = n - 2, k = 0, k2 = 1; j < n + n - 2;
           j++, cnt++, k = !k, k2 = -k2)
        mat[(j + k2) % n][k + 2 * i] = cnt;
    }
    if (m % 2 == 1) {
      for (int j = 1; j < n; j += 2) mat[j][m - 1] = mat[j][m - 2];
      for (int j = 0, k = 0, k2 = 1; j < n; j++, cnt++, k = !k, k2 = -k2)
        mat[j][m - 1 - k] = cnt + k2;
    }
    assert(n * m == cnt - 1);
    if (chg) {
      for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) cout << mat[j][i] << " ";
        cout << endl;
      }
    } else {
      cnt = 1;
      unordered_map<int, int> mp;
      for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++, cnt++) mp[cnt] = j * m + i + 1;
      for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) cout << mp[mat[i][j]] << " ";
        cout << endl;
      }
    }
  } else {
    if (n == 2 || n == 3) swap(n, m), chg = 1;
    cout << "YES" << endl;
    int cnt = 1, mat[n][m], p[n], j = 0;
    for (int i = 0; i < n; i += 2, j++) p[j] = i;
    for (int i = 1; i < n; i += 2, j++) p[j] = i;
    assert(j == n);
    for (int j = 0; j < m; j++) {
      for (int i = 0; i < n; i++)
        if (j % 2 == 0)
          mat[p[i]][j] = cnt++;
        else
          mat[p[(i + 1) % n]][j] = cnt++;
    }
    assert(n * m == cnt - 1);
    if (chg) {
      for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) cout << mat[j][i] << " ";
        cout << endl;
      }
    } else {
      cnt = 1;
      unordered_map<int, int> mp;
      for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++, cnt++) mp[cnt] = j * m + i + 1;
      for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) cout << mp[mat[i][j]] << " ";
        cout << endl;
      }
    }
  }
  return 0;
}
