#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
const int INF = 0x3f3f3f3f;
map<pair<int, int>, int> mp;
int vc[N];
int main() {
  int n, m;
  while (~scanf("%d %d", &n, &m)) {
    mp.clear();
    for (int i = 0; i < n; ++i) {
      for (int j = 0; j < m; ++j) {
        mp[make_pair(i, j)] = i * m + j;
      }
    }
    if (n == 1 && m == 1) {
      printf("YES\n1\n");
    } else if (n == 3 && m == 3) {
      printf("YES\n");
      printf("6 1 8\n7 5 3\n2 9 4\n");
    } else if (n >= 4) {
      printf("YES\n");
      for (int i = 0; i < m; ++i) {
        int cnt = 0;
        for (int j = 0; j < n; ++j) {
          vc[cnt++] = mp[make_pair(j, i)];
        }
        if (n == 4) {
          if (i & 1) {
            mp[make_pair(0, i)] = vc[2];
            mp[make_pair(1, i)] = vc[0];
            mp[make_pair(2, i)] = vc[3];
            mp[make_pair(3, i)] = vc[1];
          } else {
            mp[make_pair(0, i)] = vc[1];
            mp[make_pair(1, i)] = vc[3];
            mp[make_pair(2, i)] = vc[0];
            mp[make_pair(3, i)] = vc[2];
          }
          continue;
        }
        int tt = 0;
        if (i & 1) {
          for (int j = 0; j < cnt; j += 2) mp[make_pair(tt++, i)] = vc[j];
          for (int j = 1; j < cnt; j += 2) mp[make_pair(tt++, i)] = vc[j];
        } else {
          for (int j = 1; j < cnt; j += 2) mp[make_pair(tt++, i)] = vc[j];
          for (int j = 0; j < cnt; j += 2) mp[make_pair(tt++, i)] = vc[j];
        }
      }
      for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) printf("%d ", mp[make_pair(i, j)] + 1);
        printf("\n");
      }
    } else if (m >= 4) {
      printf("YES\n");
      for (int i = 0; i < n; ++i) {
        int cnt = 0;
        for (int j = 0; j < m; ++j) {
          vc[cnt++] = mp[make_pair(i, j)];
        }
        if (m == 4) {
          if (i & 1) {
            mp[make_pair(i, 0)] = vc[2];
            mp[make_pair(i, 1)] = vc[0];
            mp[make_pair(i, 2)] = vc[3];
            mp[make_pair(i, 3)] = vc[1];
          } else {
            mp[make_pair(i, 0)] = vc[1];
            mp[make_pair(i, 1)] = vc[3];
            mp[make_pair(i, 2)] = vc[0];
            mp[make_pair(i, 3)] = vc[2];
          }
          continue;
        }
        int tt = 0;
        if (i & 1) {
          for (int j = 0; j < cnt; j += 2) mp[make_pair(i, tt++)] = vc[j];
          for (int j = 1; j < cnt; j += 2) mp[make_pair(i, tt++)] = vc[j];
        } else {
          for (int j = 1; j < cnt; j += 2) mp[make_pair(i, tt++)] = vc[j];
          for (int j = 0; j < cnt; j += 2) mp[make_pair(i, tt++)] = vc[j];
        }
      }
      for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) printf("%d ", mp[make_pair(i, j)] + 1);
        printf("\n");
      }
    } else
      printf("NO\n");
  }
  return 0;
}
