Problem:
Score : 500 points

Problem Statement

AtCoDeer is thinking of painting an infinite two-dimensional grid in a checked pattern of side K.
Here, a checked pattern of side K is a pattern where each square is painted black or white so that each connected component of each color is a K × K square.
Below is an example of a checked pattern of side 3:

AtCoDeer has N desires.
The i-th desire is represented by x_i, y_i and c_i.
If c_i is B, it means that he wants to paint the square (x_i,y_i) black; if c_i is W, he wants to paint the square (x_i,y_i) white.
At most how many desires can he satisfy at the same time?

Constraints

1 ≤ N ≤ 10^5

1 ≤ K ≤ 1000

0 ≤ x_i ≤ 10^9

0 ≤ y_i ≤ 10^9

If i ≠ j, then (x_i,y_i) ≠ (x_j,y_j).

c_i is B or W.

N, K, x_i and y_i are integers.

Input

Input is given from Standard Input in the following format:

N K
x_1 y_1 c_1
x_2 y_2 c_2
:
x_N y_N c_N

Output

Print the maximum number of desires that can be satisfied at the same time.

Sample Input 1

4 3
0 1 W
1 2 W
5 3 B
5 4 B

Sample Output 1

4

He can satisfy all his desires by painting as shown in the example above.

Sample Input 2

2 1000
0 0 B
0 1 W

Sample Output 2

2

Sample Input 3

6 2
1 2 B
2 1 W
2 2 B
1 0 B
0 6 W
4 5 W

Sample Output 3

4

Solution in Scala (2.13.1) (judge verdict: Accepted)

object Main extends App {
  val sc = new FastScanner(System.in)
  val n, k = sc.nextInt()
  val xyc = List.fill(n)((sc.nextInt(), sc.nextInt(), sc.next() == "B"))

  def compose(x1: Int, x2: Int): Int = {
    x1 * (k+1) + x2
  }

  var b = Array.fill((k+1) * (k+1))(0)
  var w = Array.fill((k+1) * (k+1))(0)

  for ((x, y, c) <- xyc) {
    val qx = x / k
    val qy = y / k
    if (c ^ ((qx + qy) % 2 == 1)) {
      b(compose(x % k + 1, y % k + 1)) += 1
    } else {
      w(compose(x % k + 1, y % k + 1)) += 1
    }
  }

  for {
    i <- 1 to k
    j <- 1 to k
  } {
    b(compose(i, j)) += b(compose(i, j-1))
    w(compose(i, j)) += w(compose(i, j-1))
  }

  for {
    j <- 1 to k
    i <- 1 to k
  } {
    b(compose(i, j)) += b(compose(i-1, j))
    w(compose(i, j)) += w(compose(i-1, j))
  }

  var ans = 0
  for {
    i <- 0 to k
    j <- 0 to k
  } {
    val bc1 = b(compose(k, k)) - b(compose(i, k)) - b(compose(k, j)) + 2 * b(compose(i, j))
    val wc1 = w(compose(i, k)) + w(compose(k, j)) - 2 * w(compose(i, j))
    ans = ans.max(bc1 + wc1)

    val bc2 = b(compose(i, k)) + b(compose(k, j)) - 2 * b(compose(i, j))
    val wc2 = w(compose(k, k)) - w(compose(i, k)) - w(compose(k, j)) + 2 * w(compose(i, j))
    ans = ans.max(bc2 + wc2)
  }
  println(ans)
}

class FastScanner(source: java.io.InputStream) {
  val buf = new Array[Byte](1024)
  var now, end = 0

  def isPrintable(b: Byte): Boolean = 33 <= b && b <= 126
  def isNum(b: Byte): Boolean = 48 <= b && b <= 57

  def hasNextByte: Boolean = {
    if (now < end) {
      true
    } else {
      now = 0
      end = source.read(buf)
      end > 0
    }
  }

  def nextByte(): Byte = {
    if (hasNextByte) {
      val b = buf(now)
      now += 1
      b
    } else {
      -1
    }
  }

  def hasNext: Boolean = {
    while (hasNextByte && !isPrintable(buf(now))) {
      now += 1
    }
    hasNextByte
  }

  def next(): String = {
    if (hasNext) {
      val sb = new StringBuilder()
      var b = nextByte()
      while (isPrintable(b)) {
        sb += b.toChar
        b = nextByte()
      }
      sb.toString
    } else {
      throw new NoSuchElementException()
    }
  }

  def nextInt(): Int = {
    nextLong().toInt
  }

  def nextLong(): Long = {
    if (hasNext) {
      var b = nextByte()
      var sign = 1
      var n = 0L
      if (b == '-') {
        sign = -1
        b = nextByte()
      }
      while (isNum(b)) {
        n = n * 10 + (b - 48)
        b = nextByte()
      }
      sign * n
    } else {
      throw new NoSuchElementException()
    }
  }

  def nextDouble(): Double = next().toDouble
}