#include <bits/stdc++.h>
using namespace std;
const int maxn = 107;
const int dx[4] = {-1, 0, 1, 0};
const int dy[4] = {0, 1, 0, -1};
char a[maxn][maxn];
int m, n;
bool found(int x, int y, char ch) {
  int xt, yt;
  for (int k = 0, _a = (4); k < _a; ++k) {
    xt = x + dx[k];
    yt = y + dy[k];
    if (xt >= 1 && xt <= m && yt >= 1 && yt <= n && a[xt][yt] == ch) return 1;
  }
  return 0;
}
void fill(int x1, int y1, int x2, int y2, char ch) {
  for (int x = x1, _c = x2; x <= _c; x++)
    for (int y = y1, _c = y2; y <= _c; y++) a[x][y] = ch;
}
bool ok(int x1, int y1, int x2, int y2, char ch) {
  for (int x = x1, _c = x2; x <= _c; x++) {
    if (a[x][y1] != '@' || found(x, y1, ch)) return 0;
    if (a[x][y2] != '@' || found(x, y2, ch)) return 0;
  }
  for (int y = y1, _c = y2; y <= _c; y++) {
    if (a[x1][y] != '@' || found(x1, y, ch)) return 0;
    if (a[x2][y] != '@' || found(x2, y, ch)) return 0;
  }
  return 1;
}
bool can_put(int x, int y, char ch) {
  for (char c = 'A'; c < ch; ++c)
    if (!found(x, y, c)) return 1;
  return 0;
}
void dofill(int x, int y, char ch) {
  int l = 1, r = min(m - x + 1, n - y + 1), len, res = 1;
  for (len = 1; len <= r && ok(x, y, x + len - 1, y + len - 1, ch); ++len) {
    res = len;
    if (y + len <= n && can_put(x, y + len, ch)) break;
  }
  fill(x, y, x + res - 1, y + res - 1, ch);
}
int main() {
  cin >> m >> n;
  for (int i = 1, _c = m; i <= _c; i++)
    for (int j = 1, _c = n; j <= _c; j++) a[i][j] = '@';
  for (int x = 1, _c = m; x <= _c; x++)
    for (int y = 1, _c = n; y <= _c; y++)
      if (a[x][y] == '@') {
        char ch = 'A';
        while (found(x, y, ch)) ++ch;
        dofill(x, y, ch);
      }
  for (int x = 1, _c = m; x <= _c; x++) {
    for (int y = 1, _c = n; y <= _c; y++) putchar(a[x][y]);
    puts("");
  }
}
