#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

// 内部定数
#define D_SIZE_MAX		1000									// 最大１辺サイズ
#define D_COLOR_WHITE	'W'										// 白

// 内部変数
static int siSize;												// １辺サイズ
static int si2Mass[D_SIZE_MAX * 2 + 5][D_SIZE_MAX + 5];			// 希望する位置を満たす黒正方形の左下位置(いもす法)

// 内部変数 - テスト用
#ifdef D_TEST
	static int siRes;
	static FILE *szpFpT, *szpFpA;
#endif

// 実行メイン
int
fMain(
	int piTNo					// <I> テスト番号 1～
)
{
	int i, j;
	char lc1Buf[1024], lc1Out[1024];

	// 初期化
	memset(si2Mass, 0, sizeof(si2Mass));						// 黒正方形の左下位置

	// テストファイルオープン
#ifdef D_TEST
	sprintf(lc1Buf, ".\\Test\\T%d.txt", piTNo);
	szpFpT = fopen(lc1Buf, "r");
	sprintf(lc1Buf, ".\\Test\\A%d.txt", piTNo);
	szpFpA = fopen(lc1Buf, "r");
	siRes = 0;
#endif

	// 希望数・一辺サイズ取得
	int liNCnt;
#ifdef D_TEST
	fgets(lc1Buf, sizeof(lc1Buf), szpFpT);
#else
	fgets(lc1Buf, sizeof(lc1Buf), stdin);
#endif
	sscanf(lc1Buf, "%d%d", &liNCnt, &siSize);

	// 希望取得
	for (i = 0; i < liNCnt; i++) {
		int liX, liY;
		char lcColor;
#ifdef D_TEST
		fgets(lc1Buf, sizeof(lc1Buf), szpFpT);
#else
		fgets(lc1Buf, sizeof(lc1Buf), stdin);
#endif
		sscanf(lc1Buf, "%d %d %c", &liX, &liY, &lcColor);

		// 白を黒の同一に置き換え
		if (lcColor == D_COLOR_WHITE) {
			liX += siSize;
		}

		// 正方形４つ分に置き換え
		liX %= siSize * 2;
		liY %= siSize * 2;

		// 正方形横２つ分に置き換え
		if (liY >= siSize) {
			liY -= siSize;
			if (liX < siSize) {
				liX += siSize;
			}
			else {
				liX -= siSize;
			}
		}

		// 希望する位置を満たす黒正方形の左下・右上位置１(左側)
		int li1Sx[4], li1Ex[4], li1Sy[4], li1Ey[4];
		li1Sx[0] = liX - siSize * 2 + 1;
		li1Ex[0] = li1Sx[0] + siSize;
		li1Sy[0] = liY + 1;
		li1Ey[0] = siSize;

		// 希望する位置を満たす黒正方形の左下・右上位置２(自身)
		li1Sx[1] = li1Ex[0];
		li1Ex[1] = li1Sx[1] + siSize;
		li1Sy[1] = 0;
		li1Ey[1] = liY + 1;

		// 希望する位置を満たす黒正方形の左下・右上位置３(右側１)
		li1Sx[2] = li1Ex[1];
		li1Ex[2] = li1Sx[2] + siSize;
		li1Sy[2] = liY + 1;
		li1Ey[2] = siSize;

		// 希望する位置を満たす黒正方形の左下・右上位置３(右側２)
		li1Sx[3] = li1Ex[2];
		li1Ex[3] = li1Sx[3] + siSize;
		li1Sy[3] = 0;
		li1Ey[3] = liY + 1;

		// セット
		for (j = 0; j < 4; j++) {

			// 範囲チェック
			if (li1Ex[j] < 1) {
				continue;
			}
			if (li1Sx[j] >= siSize * 2) {
				continue;
			}
			if (li1Ey[j] < 1) {
				continue;
			}
			if (li1Sy[j] >= siSize) {
				continue;
			}

			// 範囲補正
			if (li1Ex[j] > siSize * 2) {
				li1Ex[j] = siSize * 2;
			}
			if (li1Sx[j] < 0) {
				li1Sx[j] = 0;
			}

			si2Mass[li1Sx[j]][li1Sy[j]]++;			// 横方向の開始位置
			si2Mass[li1Ex[j]][li1Sy[j]]--;			// 横方向の終了位置
			si2Mass[li1Sx[j]][li1Ey[j]]--;			// 縦方向の終了位置
			si2Mass[li1Ex[j]][li1Ey[j]]++;			// 縦方向の終了位置の終了位置
		}
	}

	// 横方向に展開
	for (i = 0; i < siSize; i++) {
		for (j = 1; j < siSize * 2; j++) {
			si2Mass[j][i] += si2Mass[j - 1][i];
		}
	}

	// 縦方向に展開
	for (i = 0; i < siSize * 2; i++) {
		for (j = 1; j < siSize; j++) {
			si2Mass[i][j] += si2Mass[i][j - 1];
		}
	}

	// 最大値を検索
	int liMax = 0;
	for (i = 0; i < siSize * 2; i++) {
		for (j = 0; j < siSize; j++) {
			if (liMax < si2Mass[i][j]) {
				liMax = si2Mass[i][j];
			}
		}
	}

	// 結果セット
	sprintf(lc1Out, "%d\n", liMax);

	// 結果表示
#ifdef D_TEST
	fgets(lc1Buf, sizeof(lc1Buf), szpFpA);
	if (strcmp(lc1Buf, lc1Out)) {
		siRes = -1;
	}
#else
	printf("%s", lc1Out);
#endif

	// テストファイルクローズ
#ifdef D_TEST
	fclose(szpFpT);
	fclose(szpFpA);
#endif

	// テスト結果
#ifdef D_TEST
	if (siRes == 0) {
		printf("OK %d\n", piTNo);
	}
	else {
		printf("NG %d\n", piTNo);
	}
#endif

	return 0;
}

int
main()
{

#ifdef D_TEST
	int i;
	for (i = D_TEST_SNO; i <= D_TEST_ENO; i++) {
		fMain(i);
	}
#else
	fMain(0);
#endif

	return 0;
}



Measured memory_bytes: 8064