Problem p03217 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cctype>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

using namespace std;

#define MAX 100002

int n;
int d;

int cnt[1002][1002];

inline int rng(int a, int b, int c) { // count [a,b] x%d==c
  int below = (a / d) * d + c;
  while (below < a) {
    below += d;
  }
  int up = (b / d) * d + c;
  while (up > b) {
    up -= d;
  }
  if (below > up)
    return 0;
  return (up - below) / d + 1;
}

vector<pair<int, pair<int, int>>> vv;

bool valid(int x, int y, int len) {
  long long int guarantee = len / d;
  guarantee *= guarantee;
  for (int i1 = 0; i1 < vv.size(); i1++) {
    int i = vv[i1].second.first;
    int j = vv[i1].second.second;
    long long int validx = rng(x, x + len, i);
    long long int validy = rng(y, y + len, j);
    validx *= validy;
    if (validx < cnt[i][j]) {
      return false;
    }
    if (cnt[i][j] == 0)
      break;
    if (cnt[i][j] <= guarantee)
      break;
  }
  return true;
}

int main() {
  cin >> n >> d;
  for (int i = 0; i < n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    cnt[x % d][y % d]++;
  }
  for (int i = 0; i < d; i++) {
    for (int j = 0; j < d; j++) {
      vv.push_back(make_pair(cnt[i][j], make_pair(i, j)));
    }
  }
  sort(vv.begin(), vv.end());
  reverse(vv.begin(), vv.end());
  int ans = 1000000;
  for (int ii = 0; ii < vv.size(); ii++) {
    int i = vv[ii].second.first;
    int j = vv[ii].second.second;
    int mint = 0;
    int maxt = ans;
    if (valid(i, j, ans - 1) == false)
      continue;
    else {
      maxt = ans - 1;
      if (mint > maxt)
        continue;
      while (mint + 1 < maxt) {
        int mid = (mint + maxt) / 2;
        if (valid(i, j, mid)) {
          maxt = mid;
        } else {
          mint = mid + 1;
        }
      }
      if (valid(i, j, mint)) {
        maxt = mint;
      } else {
        mint = maxt;
      }
      ans = min(ans, mint);
    }
    if (ii % 40 == 0 && d > 30 && clock() / (double)(CLOCKS_PER_SEC) > 2.2)
      break;
  }
  cout << ans << endl;
  return 0;
}

Fixed submission:
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cctype>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

using namespace std;

#define MAX 100002

int n;
int d;

int cnt[1002][1002];

inline int rng(int a, int b, int c) { // count [a,b] x%d==c
  int below = (a / d) * d + c;
  while (below < a) {
    below += d;
  }
  int up = (b / d) * d + c;
  while (up > b) {
    up -= d;
  }
  if (below > up)
    return 0;
  return (up - below) / d + 1;
}

vector<pair<int, pair<int, int>>> vv;

bool valid(int x, int y, int len) {
  long long int guarantee = len / d;
  guarantee *= guarantee;
  for (int i1 = 0; i1 < vv.size(); i1++) {
    int i = vv[i1].second.first;
    int j = vv[i1].second.second;
    long long int validx = rng(x, x + len, i);
    long long int validy = rng(y, y + len, j);
    validx *= validy;
    if (validx < cnt[i][j]) {
      return false;
    }
    if (cnt[i][j] == 0)
      break;
    if (cnt[i][j] <= guarantee)
      break;
  }
  return true;
}

int main() {
  cin >> n >> d;
  for (int i = 0; i < n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    cnt[x % d][y % d]++;
  }
  for (int i = 0; i < d; i++) {
    for (int j = 0; j < d; j++) {
      vv.push_back(make_pair(cnt[i][j], make_pair(i, j)));
    }
  }
  sort(vv.begin(), vv.end());
  reverse(vv.begin(), vv.end());
  int ans = 1000000;
  for (int ii = 0; ii < vv.size(); ii++) {
    int i = vv[ii].second.first;
    int j = vv[ii].second.second;
    int mint = 0;
    int maxt = ans;
    if (valid(i, j, ans - 1) == false) {

    } else {
      maxt = ans - 1;
      if (mint > maxt)
        continue;
      while (mint + 1 < maxt) {
        int mid = (mint + maxt) / 2;
        if (valid(i, j, mid)) {
          maxt = mid;
        } else {
          mint = mid + 1;
        }
      }
      if (valid(i, j, mint)) {
        maxt = mint;
      } else {
        mint = maxt;
      }
      ans = min(ans, mint);
    }
    if (ii % 40 == 0 && d > 30 && clock() / (double)(CLOCKS_PER_SEC) > 2.2)
      break;
  }
  cout << ans << endl;
  return 0;
}