Problem p03217 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#define infll 0x3f3f3f3f3f3f3f3fll
using namespace std;
typedef long long ll;

template <typename Tp> inline void getint(Tp &num) {
  register int ch, neg = 0;
  while (!isdigit(ch = getchar()))
    if (ch == '-')
      neg = 1;
  num = ch & 15;
  while (isdigit(ch = getchar()))
    num = num * 10 + (ch & 15);
  if (neg)
    num = -num;
}

int N, D, A[1005][1005], k;
ll ans = infll;
int f[2005][2005], g[2005][2005], sf[2005][2005], sg[2005][2005];

inline bool check(int a[][2005], const int &lx, const int &ly, const int &rx,
                  const int &ry) {
  if (lx > rx || ly > ry)
    return 1;
  return a[rx][ry] - a[rx][ly - 1] - a[lx - 1][ry] + a[lx - 1][ly - 1] ==
         (rx - lx + 1) * (ry - ly + 1);
}

inline bool check(const int &x, const int &y, const int &b) {
  return check(sf, x + b + 1, y + b + 1, x + D - 1, y + D - 1) &&
         check(sg, x, y + b + 1, x + D - 1, y + D - 1) &&
         check(sg, x + b + 1, y, x + D - 1, y + D - 1);
}

inline ll calc(const int &x, const int &y) {
  int l = 0, r = D - 1;
  while (l < r) {
    const int mid = l + r >> 1;
    if (check(x, y, mid))
      r = mid;
    else
      l = mid + 1;
  }
  return k * (ll)D + l;
}

int main() {
  getint(N), getint(D);
  if (N == 1)
    return puts("0"), 0;
  for (register int i = 1, x, y; i <= N; i++)
    getint(x), getint(y), A[x % D][y % D]++;
  for (register int i = 0; i < D; i++)
    for (register int j = 0; j < D; j++)
      k = max(k, A[i][j]);
  k = (int)sqrt(k - 0.5);
  for (register int i = 0, F = k * k, G = k * (k + 1); i < D; i++)
    for (register int j = 0; j < D; j++) {
      f[i][j] = f[i + D][j] = f[i][j + D] = f[i + D][j + D] = A[i][j] <= F;
      g[i][j] = g[i + D][j] = g[i][j + D] = g[i + D][j + D] = A[i][j] <= G;
    }
  sf[0][0] = f[0][0], sg[0][0] = g[0][0];
  for (register int i = 1; i < (D << 1); i++) {
    sf[0][i] = sf[0][i - 1] + f[0][i], sg[0][i] = sg[0][i - 1] + g[0][i];
    sf[i][0] = sf[i - 1][0] + f[i][0], sg[i][0] = sg[i - 1][0] + g[i][0];
  }
  for (register int i = 1; i < (D << 1); i++)
    for (register int j = 1; j < (D << 1); j++) {
      sf[i][j] = sf[i][j - 1] + sf[i - 1][j] - sf[i - 1][j - 1] + f[i][j];
      sg[i][j] = sg[i][j - 1] + sg[i - 1][j] - sg[i - 1][j - 1] + g[i][j];
    }
  for (register int i = 0; i < D; i++)
    for (register int j = 0; j < D; j++)
      ans = min(ans, calc(i, j));
  return printf("%lld\n", ans), 0;
}

Fixed submission:
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#define infll 0x3f3f3f3f3f3f3f3fll
using namespace std;
typedef long long ll;

template <typename Tp> inline void getint(Tp &num) {
  register int ch, neg = 0;
  while (!isdigit(ch = getchar()))
    if (ch == '-')
      neg = 1;
  num = ch & 15;
  while (isdigit(ch = getchar()))
    num = num * 10 + (ch & 15);
  if (neg)
    num = -num;
}

int N, D, A[1005][1005], k;
ll ans = infll;
int f[2005][2005], g[2005][2005], sf[2005][2005], sg[2005][2005];

inline bool check(int a[][2005], const int &lx, const int &ly, const int &rx,
                  const int &ry) {
  if (lx > rx || ly > ry)
    return 1;
  return a[rx][ry] - (ly ? a[rx][ly - 1] : 0) - (lx ? a[lx - 1][ry] : 0) +
             (lx && ly ? a[lx - 1][ly - 1] : 0) ==
         (rx - lx + 1) * (ry - ly + 1);
}

inline bool check(const int &x, const int &y, const int &b) {
  return check(sf, x + b + 1, y + b + 1, x + D - 1, y + D - 1) &&
         check(sg, x, y + b + 1, x + D - 1, y + D - 1) &&
         check(sg, x + b + 1, y, x + D - 1, y + D - 1);
}

inline ll calc(const int &x, const int &y) {
  int l = 0, r = D - 1;
  while (l < r) {
    const int mid = l + r >> 1;
    if (check(x, y, mid))
      r = mid;
    else
      l = mid + 1;
  }
  return k * (ll)D + l;
}

int main() {
  getint(N), getint(D);
  if (N == 1)
    return puts("0"), 0;
  for (register int i = 1, x, y; i <= N; i++)
    getint(x), getint(y), A[x % D][y % D]++;
  for (register int i = 0; i < D; i++)
    for (register int j = 0; j < D; j++)
      k = max(k, A[i][j]);
  k = (int)sqrt(k - 0.5);
  for (register int i = 0, F = k * k, G = k * (k + 1); i < D; i++)
    for (register int j = 0; j < D; j++) {
      f[i][j] = f[i + D][j] = f[i][j + D] = f[i + D][j + D] = A[i][j] <= F;
      g[i][j] = g[i + D][j] = g[i][j + D] = g[i + D][j + D] = A[i][j] <= G;
    }
  sf[0][0] = f[0][0], sg[0][0] = g[0][0];
  for (register int i = 1; i < (D << 1); i++) {
    sf[0][i] = sf[0][i - 1] + f[0][i], sg[0][i] = sg[0][i - 1] + g[0][i];
    sf[i][0] = sf[i - 1][0] + f[i][0], sg[i][0] = sg[i - 1][0] + g[i][0];
  }
  for (register int i = 1; i < (D << 1); i++)
    for (register int j = 1; j < (D << 1); j++) {
      sf[i][j] = sf[i][j - 1] + sf[i - 1][j] - sf[i - 1][j - 1] + f[i][j];
      sg[i][j] = sg[i][j - 1] + sg[i - 1][j] - sg[i - 1][j - 1] + g[i][j];
    }
  for (register int i = 0; i < D; i++)
    for (register int j = 0; j < D; j++)
      ans = min(ans, calc(i, j));
  return printf("%lld\n", ans), 0;
}