Problem p03460 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int MX = 3322;
int n, k, x, y;
int bit[2][MX][MX], all[2];
char c[2];

void add(int t, int x, int y) { bit[t][x][y]++; }

int get(int t, int x, int y) {
  if (x < 1000 || y < 1000)
    return 0;
  return bit[t][x][y];
}

int get0(int x, int y, int t) {
  int tt = 1 - t;
  int tmp =
      get(t, x, y) - get(t, x - k, y) - get(t, x, y - k) + get(t, x - k, y - k);
  tmp -= get(tt, x, y) - get(tt, x - k, y) - get(tt, x, y - k) +
         get(tt, x - k, y - k);
  return tmp;
}

int main() {

  scanf("%d %d", &n, &k);
  for (int i = 0; i < n; i++) {
    scanf("%d %d %s", &x, &y, c);
    x %= (2 * k);
    y %= (2 * k);
    x += 1001;
    y += 1001;
    add(c[0] == 'W', x, y);
    all[c[0] == 'W']++;
  }

  for (int t = 0; t < 2; t++) {
    for (int i = 0; i < MX; i++)
      for (int j = 0; j < MX; j++) {
        if (i)
          bit[t][i][j] += bit[t][i - 1][j];
        if (j)
          bit[t][i][j] += bit[t][i][j - 1];
        if (i * j)
          bit[t][i][j] -= bit[t][i - 1][j - 1];
      }
  }

  int ans = 0, tmp = 0;
  for (int x = 1001; x < 1001 + k; x++)
    for (int y = 1001; y < 1001 + k; y++)
      for (int t = 0; t < 2; t++) {
        tmp = 0;
        tmp += get0(x, y, t);
        tmp += get0(x + k, y + k, t);
        tmp += get0(x + k, y - k, t);
        tmp += get0(x + k + k, y, t);
        tmp += get0(x, y + k + k, t);
        tmp += get0(x + k + k, y + k + k, t);
        tmp += all[1 - t];
        ans = max(ans, tmp);
        if (ans == n) {
          printf("%d\n", ans);
          return 0;
        }
      }
  printf("%d\n", ans);
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int MX = 4322;
int n, k, x, y;
int bit[2][MX][MX], all[2];
char c[2];

void add(int t, int x, int y) { bit[t][x][y]++; }

int get(int t, int x, int y) {
  if (x < 1000 || y < 1000)
    return 0;
  return bit[t][x][y];
}

int get0(int x, int y, int t) {
  int tt = 1 - t;
  int tmp =
      get(t, x, y) - get(t, x - k, y) - get(t, x, y - k) + get(t, x - k, y - k);
  tmp -= get(tt, x, y) - get(tt, x - k, y) - get(tt, x, y - k) +
         get(tt, x - k, y - k);
  return tmp;
}

int main() {

  scanf("%d %d", &n, &k);
  for (int i = 0; i < n; i++) {
    scanf("%d %d %s", &x, &y, c);
    x %= (2 * k);
    y %= (2 * k);
    x += 1001;
    y += 1001;
    add(c[0] == 'W', x, y);
    all[c[0] == 'W']++;
  }

  for (int t = 0; t < 2; t++) {
    for (int i = 0; i < MX; i++)
      for (int j = 0; j < MX; j++) {
        if (i)
          bit[t][i][j] += bit[t][i - 1][j];
        if (j)
          bit[t][i][j] += bit[t][i][j - 1];
        if (i * j)
          bit[t][i][j] -= bit[t][i - 1][j - 1];
      }
  }

  int ans = 0, tmp = 0;
  for (int x = 1001; x < 1001 + k; x++)
    for (int y = 1001; y < 1001 + k; y++)
      for (int t = 0; t < 2; t++) {
        tmp = 0;
        tmp += get0(x, y, t);
        tmp += get0(x + k, y + k, t);
        tmp += get0(x + k, y - k, t);
        tmp += get0(x + k + k, y, t);
        tmp += get0(x, y + k + k, t);
        tmp += get0(x + k + k, y + k + k, t);
        tmp += all[1 - t];
        ans = max(ans, tmp);
        if (ans == n) {
          printf("%d\n", ans);
          return 0;
        }
      }
  printf("%d\n", ans);
  return 0;
}