#include <bits/stdc++.h>
using namespace std;
template <class T>
bool amin(T &a, T b) {
  return a > b ? (a = b, true) : false;
}
template <class T>
bool amax(T &a, T b) {
  return a < b ? (a = b, true) : false;
}
bool dfs(vector<vector<unordered_set<int> > > &nums,
         unordered_map<int, vector<int> > &nbor, vector<vector<int> > &M,
         unordered_set<int> &visited, int cnt) {
  int n = M.size(), m = M[0].size();
  if (cnt == n * m) return true;
  int i = cnt / m, j = cnt % m;
  for (int k = 0; k < n * m; k++) {
    if (visited.find(k) != visited.end() ||
        nums[i][j].find(k) != nums[i][j].end())
      continue;
    M[i][j] = k;
    visited.insert(k);
    for (auto &p : nbor[k]) {
      if (i < n - 1) nums[i + 1][j].insert(p);
      if (j < m - 1) nums[i][j + 1].insert(p);
    }
    if (dfs(nums, nbor, M, visited, cnt + 1)) return true;
    visited.erase(k);
    M[i][j] = -1;
    for (auto &p : nbor[k]) {
      if (i < n - 1) nums[i + 1][j].erase(p);
      if (j < m - 1) nums[i][j + 1].erase(p);
    }
  }
  return false;
}
int proj(int i, int m) {
  int p = 2 * i;
  if (m % 2 == 0) p++;
  return p % (m | 1);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int n, m;
  cin >> n >> m;
  bool transpose = false;
  if (n > m) {
    transpose = true;
    swap(n, m);
  }
  if (m < 4) {
    if (transpose) swap(n, m);
    vector<vector<int> > M2(n, vector<int>(m, -1));
    unordered_map<int, vector<int> > nbor;
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        int cur = i * m + j;
        if (i > 0) nbor[cur].push_back((i - 1) * m + j);
        if (j > 0) nbor[cur].push_back(i * m + j - 1);
        if (j < m - 1) nbor[cur].push_back(i * m + j + 1);
        if (i < n - 1) nbor[cur].push_back((i + 1) * m + j);
      }
    }
    vector<vector<unordered_set<int> > > nums(
        n, vector<unordered_set<int> >(m, unordered_set<int>()));
    unordered_set<int> visited;
    if (!dfs(nums, nbor, M2, visited, 0))
      cout << "NO\n";
    else {
      cout << "YES\n";
      for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) cout << M2[i][j] + 1 << ' ';
        cout << '\n';
      }
    }
  } else {
    vector<vector<int> > M2(n, vector<int>(m, -1));
    vector<vector<int> > M(n, vector<int>(m, 0));
    int cnt = 0;
    if (transpose)
      for (int j = 0; j < m; j++)
        for (int i = 0; i < n; i++) M[i][j] = ++cnt;
    else
      for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++) M[i][j] = ++cnt;
    for (int row = 0; row < n; row++) {
      if (m % 2 == 0 || row % 2 == 0) {
        for (int i = 0; i < m; i++) {
          M2[row][proj(i, m)] = M[row][i];
        }
      } else {
        for (int i = 0; i < m; i++) {
          M2[row][(proj(i, m) + 1) % m] = M[row][i];
        }
      }
      if (row % 2 != 0 && m % 2 == 0) {
        reverse(M2[row].begin(), M2[row].end());
      }
    }
    cout << "YES\n";
    if (transpose) {
      for (int j = 0; j < m; j++) {
        for (int i = 0; i < n; i++) cout << M2[i][j] << ' ';
        cout << '\n';
      }
    } else {
      for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) cout << setw(2) << M2[i][j] << ' ';
        cout << '\n';
      }
    }
  }
}
