Problem:
Score : 700 points

Problem Statement

We have a grid with H rows and W columns of squares.
We will represent the square at the i-th row from the top and j-th column from the left as (i,\ j).
Also, we will define the distance between the squares (i_1,\ j_1) and (i_2,\ j_2) as |i_1 - i_2| + |j_1 - j_2|.

Snuke is painting each square in red, yellow, green or blue.
Here, for a given positive integer d, he wants to satisfy the following condition:

No two squares with distance exactly d have the same color.

Find a way to paint the squares satisfying the condition.
It can be shown that a solution always exists.

Constraints

2 ≤ H, W ≤ 500

1 ≤ d ≤ H + W - 2

Input

Input is given from Standard Input in the following format:

H W d

Output

Print a way to paint the squares satisfying the condition, in the following format. If the square (i,\ j) is painted in red, yellow, green or blue, c_{ij} should be R, Y, G or B, respectively.

c_{11}c_{12}...c_{1W}
:
c_{H1}c_{H2}...c_{HW}

Sample Input 1

2 2 1

Sample Output 1

RY
GR

There are four pairs of squares with distance exactly 1.
As shown below, no two such squares have the same color.

(1,\ 1), (1,\ 2) : R, Y

(1,\ 2), (2,\ 2) : Y, R

(2,\ 2), (2,\ 1) : R, G

(2,\ 1), (1,\ 1) : G, R

Sample Input 2

2 3 2

Sample Output 2

RYB
RGB

There are six pairs of squares with distance exactly 2.
As shown below, no two such squares have the same color.

(1,\ 1) , (1,\ 3) : R , B

(1,\ 3) , (2,\ 2) : B , G

(2,\ 2) , (1,\ 1) : G , R

(2,\ 1) , (2,\ 3) : R , B

(2,\ 3) , (1,\ 2) : B , Y

(1,\ 2) , (2,\ 1) : Y , R

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath> 
using namespace std;
int n, m, k, cnt[1000], num[10], d, col[1000][1000], a[2000][2000];
const char tu[4] = {'R', 'B', 'G', 'Y'};
int get(int x, int y, int ty) {
	if(!ty) return x - 1 + (m - y);
	return n + m - 1 + (n - x) + m - y;
}

void add(int ty, int p, int x, int val) {
	if(p < 0) return;
	if(ty == 0 && p >= n + m - 1) return;
	if(ty == 1 && p >= n + m + n + m - 2) return; 
	if(ty == 1 && p < n + m - 1) return; 
	//printf("%d %d\n", p, x);
	int lim = !ty ? m + m + 1 + m : n + n + 1 + n;
	for(; x <= lim; x += -x & x) a[p][x] += val;
}

int query(int p, int x) {
	int ans = 0;
	for(; x; x -= -x & x) ans += a[p][x];
	return ans;
}

void upd(int x, int y, int co) {
	int up = x - d, dn = x + d;
	int lt = y - d, rt = y + d;
	//printf("%d %d %d %d %d %d\n", x, y, get(up, y, 0), get(dn, y, 0), get(x, lt, 1), get(x, rt, 1));
	add(0, get(up, y, 0), y + m, co);
	add(0, get(up, y, 0), rt + 1 + m, -co);
	add(0, get(dn, y, 0), lt + m, co);
	add(0, get(dn, y, 0), y + 1 + m, -co);
	add(1, get(x, lt, 1), x + 1 + n, co);
	add(1, get(x, lt, 1), dn + n, -co);
	add(1, get(x, rt, 1), up + 1 + n, co);
	add(1, get(x, rt, 1), x + n, - co);
}

int main() {
	scanf("%d%d%d", &n, &m, &d);
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= m; j++) {
			int now = query(get(i, j, 0), j + m) | query(get(i, j, 1), i);
			//printf("%d\n", now);
			for(int k = 0; k < 4; k++) 
				if((now & (1 << k)) == 0)  {
					col[i][j] = k;
					upd(i, j, (1 << k));
					break;
				}
		}
	for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= m; j++) printf("%c", tu[col[i][j]]);
		printf("\n");
	}
	return 0;	
}