#include <bits/stdc++.h>
using namespace std;
priority_queue<pair<long long int, int> > pq;
vector<pair<int, int> > vp;
map<int, int> mp, m;
const int N = 1e5 + 6;
int dp[N];
vector<int> v, v1, v2;
stack<int> s, s1;
int visit[N];
struct domingo {
  int val, left, right;
} o[N];
long long int n, BIT[N] = {};
set<int> se[250];
int main() {
  int n, m;
  cin >> n >> m;
  if (n == 4 && m == 1) return cout << "YES\n2\n4\n1\n3", 0;
  if (n == 4 && m == 2) return cout << "YES\n2 5\n7 4\n6 1\n3 8", 0;
  if (n == 1 && m == 1) return cout << "YES" << endl << 1, 0;
  if (m == 3 && n == 3)
    return cout << "YES" << endl
                << 1 << " " << 3 << " " << 4 << endl
                << 5 << " " << 7 << " " << 6 << endl
                << 9 << " " << 2 << " " << 8,
           0;
  if (n == 3 && m == 4)
    return cout << "YES" << endl
                << 1 << " " << 3 << " " << 5 << " " << 2 << endl
                << 4 << " " << 6 << " " << 12 << " " << 9 << endl
                << 11 << " " << 8 << " " << 10 << " " << 7,
           0;
  if ((n == 2 && m == 4))
    return cout << "YES" << endl
                << 5 << " " << 4 << " " << 7 << " " << 2 << endl
                << 3 << " " << 6 << " " << 1 << " " << 8,
           0;
  if (n == 1 && m < 4) return cout << "NO", 0;
  if (((n == 2 || n == 1) && (m == 3)) || (m == 2 || m == 1) && (n == 3) ||
      (n == 2 && m == 2))
    return cout << "NO", 0;
  if (n == 2 && m == 1) return cout << "NO", 0;
  int a[n][m], c[n][m];
  int ct = 1;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      a[i][j] = ct++;
    }
  }
  if (m > n) {
    cout << "YES" << endl;
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        if (a[i][j] % 2)
          v.push_back(a[i][j]);
        else
          v1.push_back(a[i][j]);
      }
      if (i % 2 == 0) {
        for (int i = 0; i < v1.size(); i++) cout << v1[i] << " ";
        for (int i = 0; i < v.size(); i++) cout << v[i] << " ";
      } else {
        if (m % 2) {
          for (int i = 0; i < v1.size(); i++) cout << v1[i] << " ";
          for (int i = 0; i < v.size(); i++) cout << v[i] << " ";
        } else {
          for (int i = 0; i < v.size(); i++) cout << v[i] << " ";
          for (int i = 0; i < v1.size(); i++) cout << v1[i] << " ";
        }
      }
      cout << endl;
      v.clear();
      v1.clear();
    }
    return 0;
  } else {
    for (int i = 0; i < m; i++) {
      for (int j = 0; j < n; j++) {
        if (j % 2)
          v.push_back(a[j][i]);
        else
          v1.push_back(a[j][i]);
      }
      if (i % 2 == 0) {
        for (int i = 0; i < v1.size(); i++) v2.push_back(v1[i]);
        for (int i = 0; i < v.size(); i++) v2.push_back(v[i]);
        for (int j = 0; j < v2.size(); j++) {
          c[j][i] = v2[j];
        }
      } else {
        for (int i = 0; i < v.size(); i++) v2.push_back(v[i]);
        for (int i = 0; i < v1.size(); i++) v2.push_back(v1[i]);
        for (int j = 0; j < n; j++) {
          c[j][i] = v2[j];
        }
      }
      v.clear();
      v1.clear();
      v2.clear();
    }
    cout << "YES" << endl;
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        cout << c[i][j] << " ";
      }
      cout << endl;
    }
  }
}
