#include <bits/stdc++.h>
using namespace std;
void draganov_style() {
  ios_base::sync_with_stdio(false);
  cout.tie(0);
  cin.tie(0);
}
int n, m;
vector<vector<int> > tab;
void print() {
  cout << "YES\n";
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      cout << tab[i][j] << " ";
    }
    cout << "\n";
  }
}
bool cmp(int a, int b) {
  if (a % 2 == b % 2) return a < b;
  return (a % 2) < (b % 2);
}
bool cmp1(int a, int b) {
  if (a % 2 == b % 2) return a > b;
  return (a % 2) < (b % 2);
}
bool cmp4(int a, int b) {
  if (a % 2 == b % 2) return a < b;
  return (a % 2) < (b % 2);
}
bool cmp2(pair<int, int> a, pair<int, int> b) {
  if (a.second % 2 == b.second % 2) return a.first > b.first;
  return (a.second % 2) < (b.second % 2);
}
bool cmp3(pair<int, int> a, pair<int, int> b) {
  if (a.second % 2 == b.second % 2) return a.first > b.first;
  return (a.second % 2) > (b.second % 2);
}
int main() {
  draganov_style();
  cin >> n >> m;
  if (n == 1 && m == 1) {
    cout << "YES\n1";
  } else if (n <= 3 && m <= 3 && n + m < 6) {
    cout << "NO";
  } else if (n == 3 && m == 3) {
    cout << "YES\n6 1 8\n7 5 3\n2 9 4";
  } else if (m % 2) {
    if (n <= m) {
      tab.resize(n);
      for (int j = 0; j < n; j++) tab[j].resize(m);
      int k = 0;
      for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
          tab[i][j] = ++k;
        }
        sort(tab[i].begin(), tab[i].end(), cmp);
      }
    } else {
      tab.resize(m);
      for (int j = 0; j < m; j++) tab[j].resize(n);
      int k = 1;
      for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
          tab[i][j] = k + m * (j);
        }
        k++;
        if (i % 2 == 0)
          sort(tab[i].begin(), tab[i].end(), cmp);
        else if (i % 2 == 1 && n % 2 == 0)
          sort(tab[i].begin(), tab[i].end(), cmp1);
        else
          sort(tab[i].begin(), tab[i].end(), cmp4);
      }
      cout << "YES\n";
      for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
          cout << tab[j][i] << " ";
        }
        cout << "\n";
      }
      return 0;
    }
    print();
  } else {
    if (m != 2) {
      tab.resize(n);
      for (int j = 0; j < n; j++) tab[j].resize(m);
      for (int i = 0; i < n; i++) {
        int tmp = 2 + i * m;
        for (int j = 0; j < m / 2; j++) {
          tab[i][j] = tmp;
          tmp += 2;
        }
        tmp = 1 + i * m;
        for (int j = m / 2; j < m; j++) {
          tab[i][j] = tmp;
          tmp += 2;
        }
        if (i % 2 == 0) {
          for (int j = 0; j < m / 2; j++) swap(tab[i][j], tab[i][m - 1 - j]);
        }
      }
      print();
    } else {
      cout << "YES\n";
      vector<vector<pair<int, int> > > tab2;
      tab2.resize(m);
      for (int j = 0; j < m; j++) tab2[j].resize(n);
      for (int j = 0; j < m; j++) {
        int t = j + 1;
        for (int i = 0; i < n; i++) {
          tab2[j][i] = make_pair(t, i);
          t += 2;
        }
        if (n % 2) {
          if (!j)
            sort(tab2[j].begin(), tab2[j].end(), cmp2);
          else
            sort(tab2[j].begin(), tab2[j].end(), cmp3);
        } else {
          sort(tab2[j].begin(), tab2[j].end(), cmp2);
          if (j) {
            for (int i = 0; i < n / 2; i++)
              swap(tab2[j][i], tab2[j][n - 1 - i]);
          }
        }
      }
      for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
          cout << tab2[j][i].first << " ";
        }
        cout << "\n";
      }
    }
  }
  return 0;
}
