#include <bits/stdc++.h>
using namespace std;
const int INF = 2147483647;
const long long INFL = 9223372036854775807LL;
const double EPSILON = 0.00000001;
const long long MOD = 1000000007;
int32_t main() {
  int n, m;
  cin >> n >> m;
  int min_dim = ((n) < (m) ? (n) : (m));
  int max_dim = ((n) > (m) ? (n) : (m));
  if (n == 1 and m == 1) {
    cout << "YES" << endl;
    cout << "1" << endl;
  } else if (min_dim <= 2 and max_dim <= 3) {
    cout << "NO" << endl;
  } else if (n == 3 and m == 3) {
    cout << "YES" << endl;
    cout << "5 1 3" << endl;
    cout << "7 9 4" << endl;
    cout << "6 2 8" << endl;
  } else if (max_dim == 4) {
    cout << "YES" << endl;
    int orig_orig[n + 5][m + 5];
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        orig_orig[i][j] = i * m + j + 1;
      }
    }
    vector<vector<int>> orig;
    bool transpose = false;
    if (m < n) {
      transpose = true;
      swap(n, m);
      for (int i = 0; i < n; i++) {
        orig.push_back(vector<int>());
        for (int j = 0; j < m; j++) {
          orig[i].push_back(orig_orig[j][i]);
        }
      }
    } else {
      for (int i = 0; i < n; i++) {
        orig.push_back(vector<int>());
        for (int j = 0; j < m; j++) {
          orig[i].push_back(orig_orig[i][j]);
        }
      }
    }
    int mat[n + 5][m + 5];
    int start = 1;
    for (int i = 0; i < n; i++) {
      int cur = 0;
      for (int j = 1; j < m; j += 2, cur++) {
        if (start == 1)
          mat[i][cur] = orig[i][j];
        else
          mat[i][m - cur - 1] = orig[i][j];
      }
      for (int j = 0; j < m; j += 2, cur++) {
        if (start == 1)
          mat[i][cur] = orig[i][j];
        else
          mat[i][m - cur - 1] = orig[i][j];
      }
      start = 1 - start;
    }
    if (transpose) {
      for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
          printf("%d ", mat[j][i]);
        }
        printf("\n");
      }
    } else {
      for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
          printf("%d ", mat[i][j]);
        }
        printf("\n");
      }
    }
  } else {
    cout << "YES" << endl;
    int orig_orig[n + 5][m + 5];
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        orig_orig[i][j] = i * m + j + 1;
      }
    }
    vector<vector<int>> orig;
    bool transpose = false;
    if (m < n) {
      transpose = true;
      swap(n, m);
      for (int i = 0; i < n; i++) {
        orig.push_back(vector<int>());
        for (int j = 0; j < m; j++) {
          orig[i].push_back(orig_orig[j][i]);
        }
      }
    } else {
      for (int i = 0; i < n; i++) {
        orig.push_back(vector<int>());
        for (int j = 0; j < m; j++) {
          orig[i].push_back(orig_orig[i][j]);
        }
      }
    }
    int mat[n + 5][m + 5];
    int start = 1;
    for (int i = 0; i < n; i++) {
      int cur = 0;
      for (int j = start; j < m; j += 2, cur++) {
        mat[i][cur] = orig[i][j];
      }
      for (int j = 1 - start; j < m; j += 2, cur++) {
        mat[i][cur] = orig[i][j];
      }
      start = 1 - start;
    }
    if (transpose) {
      for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
          printf("%d ", mat[j][i]);
        }
        printf("\n");
      }
    } else {
      for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
          printf("%d ", mat[i][j]);
        }
        printf("\n");
      }
    }
  }
  return 0;
}
