process.stdin.setEncoding('utf8');

run(function * () {
	var n = parseInt(yield);
	var m = parseInt(yield);
	var a = parseInt(yield);
	var b = parseInt(yield);
	var cell = [];
	for (var i=0; i<n*m; ++i) {
		cell[i] = '.';
	}
	var n2 = Math.floor(n / 2) * 2;

	for (var j=0; j<m; ++j) {
		for (var i=0; i<n2; i+=2) {
			cell[j + i * m] = '^';
			cell[j + (i + 1) * m] = 'v';
			--b;
			if (0 === b) break;
		}
		if (0 === b) break;
	}
	for (var i=0; i<n; ++i) {
		for (var j=m-2; j>=0; j-=2) {
			if ('.' === cell[j + i*m]) {
				cell[j + i * m] = '<';
				cell[j + 1 + i * m] = '>';
				--a;
				if (0 === a) break;
			}
		}
		if (0 === a) break;
	}
	if (0 < b || 0 < a) {
		console.log("NO");
		return;
	}

	console.log("YES");
	for (var i=0; i<n; ++i) {
		var line = "";
		for (var j=0; j<m; ++j) {
			line += cell[j + i * m];
		}
		console.log(line);
	}
});

/**
 * yield で標準入力を利用する
 * @param {GeneratorFunction} main 
 */
function run (main) {
	var gen_main = main();
	var cin = null;
	var words = [null];

	process.stdin.pause();

	function get_chunk (chunk) {
		// 標準入力を止める
		process.stdin.pause();
		// 空白区切りで分割
		var nexts = chunk.split(/\s+/);
		for (var i=0, n=nexts.length; i<n; ++i) {
			if (nexts[i]) {
				words.push(nexts[i]);
			}
		}
		loop();
	}
	function loop () {
		while (0 < words.length) {
			var result = gen_main.next(words.shift());
			if (undefined !== result.value) {
				// yield に渡された値を標準出力
				process.stdout.cork();
				process.stdout.write(result.value)
				process.stdout.uncork();
			}
			// main が return しているなら終了
			if (result.done) return;
		}

		process.stdin.resume();
	};
	process.stdin.on('data', get_chunk);

	loop();
}
