#include <bits/stdc++.h>
#define lsb(x) (x & (-x))
#define ll long long
// 43

using namespace std;

const int MAXK = (int) 1e3;
const int MAXN = (int) 1e5;

int x[MAXN + 1], y[MAXN + 1];
char c[MAXN + 1];

int ans[MAXK + 1][MAXK + 1];

inline void update(int l1, int c1, int l2, int c2) {
    //printf("%d %d %d %d\n" ,l1,c1,l2,c2);
    if(l1 <= l2 && c1 <= c2) {
        ans[l1][c1]++;
        ans[l2 + 1][c1]--;
        ans[l1][c2 + 1]--;
        ans[l2 + 1][c2 + 1]++;
    }
}

int main() {
    //ifstream cin("A.in");
    //ofstream cout("A.out");
    int i, n, k, j;
    ios::sync_with_stdio(false);
    cin >> n >> k;
    for(i = 1; i <= n; i++) {
        cin >> x[i] >> y[i] >> c[i];
    }
    for(i = 1; i <= n; i++) {
        if(c[i] == 'W') {
            int a = x[i] % k, b = y[i] % k;
            if((x[i] / k + y[i] / k) % 2 == 0) {
                update(0, 0, k - a - 1, k - b - 1);
                update(k - a, k - b, k - 1, k - 1);
            }
            else {
                update(0, k - b, k - a - 1, k - 1);
                update(k - a, 0, k - 1, k - b - 1);
            }
        }
        else {
            int a = x[i] % k, b = y[i] % k;
            if((x[i] / k + y[i] / k) % 2 == 1) {
                update(0, 0, k - a - 1, k - b - 1);
                update(k - a, k - b, k - 1, k - 1);
            }
            else {
                update(0, k - b, k - a - 1, k - 1);
                update(k - a, 0, k - 1, k - b - 1);
            }
        }
    }
    /*for(i = 0; i < k; i++) {
        for(j = 0; j < k; j++)
            printf("%d " ,ans[i][j]);
        printf("\n");
    }*/
    for(i = 0; i < k; i++) {
        for(j = 0; j < k; j++) {
            if(i > 0)
               ans[i][j] += ans[i - 1][j];
            if(j > 0)
               ans[i][j] += ans[i][j - 1];
            if(i > 0 && j > 0)
                ans[i][j] -= ans[i - 1][j - 1];
        }
    }
    /* for(i = 0; i < k; i++) {
        for(j = 0; j < k; j++)
            printf("%d " ,ans[i][j]);
        printf("\n");
    }*/
    int mx = 0;
    for(i = 0; i < k; i++) {
        for(j = 0; j < k; j++) {
            mx = max(mx, ans[i][j]);
        }
    }
    memset(ans, 0, sizeof(ans));
    for(i = 1; i <= n; i++) {
        if(c[i] == 'B') {
            int a = x[i] % k, b = y[i] % k;
            if((x[i] / k + y[i] / k) % 2 == 0) {
                update(0, 0, k - a - 1, k - b - 1);
                update(k - a, k - b, k - 1, k - 1);
            }
            else {
                update(0, k - b, k - a - 1, k - 1);
                update(k - a, 0, k - 1, k - b - 1);
            }
        }
        else {
            int a = x[i] % k, b = y[i] % k;
            if((x[i] / k + y[i] / k) % 2 == 1) {
                update(0, 0, k - a - 1, k - b - 1);
                update(k - a, k - b, k - 1, k - 1);
            }
            else {
                update(0, k - b, k - a - 1, k - 1);
                update(k - a, 0, k - 1, k - b - 1);
            }
        }
    }
     for(i = 0; i < k; i++) {
        for(j = 0; j < k; j++) {
            if(i > 0)
               ans[i][j] += ans[i - 1][j];
            if(j > 0)
               ans[i][j] += ans[i][j - 1];
            if(i > 0 && j > 0)
                ans[i][j] -= ans[i - 1][j - 1];
        }
    }
    for(i = 0; i < k; i++) {
        for(j = 0; j < k; j++) {
            mx = max(mx, ans[i][j]);
        }
    }
    cout << mx;
    //cin.close();
    //cout.close();
    return 0;
}


Measured memory_bytes: 5120