#include <bits/stdc++.h>
using namespace std;
const int MM = 1200000;
long long int m, n, k, p1, p2, p3, p, f;
string s, s1, s2;
long long int maxi(long long int N) { return 2; }
vector<int> fillx(long long int n) {
  vector<int> fx(n);
  int cur = 1;
  for (int i = 1; i < n; i += 2) fx[i] = cur++;
  for (int i = 0; i < n; i += 2) fx[i] = cur++;
  return fx;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  long long int sh1, sh2;
  if (n < m)
    sh1 = 1, sh2 = maxi(m);
  else
    sh1 = maxi(n), sh2 = 1;
  if (n == 1 && m == 1) {
    cout << "YES\n1";
    return 0;
  }
  if (n == 1) {
    if (m <= 3) {
      cout << "NO";
      return 0;
    }
    vector<int> ans = fillx(m);
    cout << "YES" << endl;
    for (int i = 0; i < m; i++) cout << ans[i] << ' ';
    return 0;
  } else if (m == 1) {
    if (n <= 3) {
      cout << "NO";
      return 0;
    }
    cout << "YES" << endl;
    vector<int> ans = fillx(n);
    for (int i = 0; i < n; i++) cout << ans[i] << endl;
    return 0;
  }
  if (n + m <= 5 || (n == 3 && m == 3)) {
    if (n == 3 && m == 3) {
      cout << "YES\n1 3 8\n5 9 4\n7 2 6";
      return 0;
    }
    cout << "NO";
    return 0;
  }
  p = 0;
  vector<vector<int> > a(n, vector<int>(m));
  cout << "YES" << endl;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) a[i][j] = p++;
  int cnt1 = 0;
  vector<int> temp(n);
  for (int i = 0; i < m; i++) {
    for (int j = 0; j < n; j++) temp[j] = a[(j + cnt1) % n][i];
    for (int j = 0; j < n; j++) a[j][i] = temp[j];
    cnt1 += sh1;
  }
  cnt1 = 0;
  temp.resize(m);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) temp[j] = a[i][(j + cnt1) % m];
    for (int j = 0; j < m; j++) a[i][j] = temp[j];
    cnt1 += sh2;
  }
  for (int i = 0; i < n; i++, cout << endl)
    for (int j = 0; j < m; j++) cout << a[i][j] + 1 << ' ';
  return 0;
}
