Problem p03858 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#include <stdio.h>
using namespace std;
#define fi cin
#define fo cout
#define x first
#define y second
#define ll long long
#define IOS                                                                    \
  ios_base ::sync_with_stdio(0);                                               \
  cin.tie(0)
#define p(v) cerr << #v << " = " << v << '\n'
#define p2(v) cerr << #v << " = " << (complex<int>(v.x, v.y)) << '\n'
#define vi vector<int>
#define vl vector<ll>
#define pii pair<int, int>
#define mp make_pair
#define db long double
#define pb push_back
#define pdd pair<db, db>
#define int ll
#define CF
int32_t main(void) {
#ifdef CF
  freopen("input", "r", stdin);
#endif // CF
  srand(time(0));
  fo << fixed << setprecision(7);
  cerr << fixed << setprecision(7);
  int n, a, b;
  IOS;
  fi >> n >> a >> b;
  static pii s[1 << 20];
  for (int i = 1; i <= n; ++i) {
    int xx, yy;
    fi >> xx >> yy;
    s[i].x = xx + yy;
    s[i].y = xx - yy;
  }
  vi v;
  for (int i = 1; i <= n; ++i)
    v.pb(s[i].x), v.pb(s[i].y);
  sort(v.begin(), v.end());
  v.resize(unique(v.begin(), v.end()) - v.begin());
  int sz = v.size();
  static int was[1 << 20];
  static int D[1 << 20];
  static int p[1 << 20];
  static multiset<pii> gx[1 << 20], gy[1 << 20];
  for (int i = 1; i <= n; ++i)
    gx[lower_bound(v.begin(), v.end(), s[i].x) - v.begin() + 1].insert(
        mp(s[i].y, i)),
        gy[lower_bound(v.begin(), v.end(), s[i].y) - v.begin() + 1].insert(
            mp(s[i].x, i));
  int dist = max(abs(s[a].x - s[b].x), abs(s[a].y - s[b].y));
  was[a] = was[b] = 1;
  queue<int> Q;
  Q.push(a);
  Q.push(b);
  while (!Q.empty()) {
    int node = Q.front();
    Q.pop();
    for (int i = -1; i < 2; ++i)
      if (i) {
        int xx = lower_bound(v.begin(), v.end(), s[node].x + i * dist) -
                 v.begin() + 1;
        if (xx > sz || s[node].x + i * dist != v[xx - 1])
          continue;
        do {
          auto it = gx[xx].lower_bound(mp(s[node].y - dist, -1));
          if (it != gx[xx].end() && it->x <= s[node].y + dist) {
            if (!was[it->y])
              was[it->y] = 1, Q.push(it->y);
            gx[xx].erase(it);
          } else
            break;
        } while (1);
      }
    for (int i = -1; i < 2; ++i)
      if (i) {
        int yy = lower_bound(v.begin(), v.end(), s[node].y + i * dist) -
                 v.begin() + 1;
        if (yy > sz || s[node].y + i * dist != v[yy - 1])
          continue;
        do {
          auto it = gy[yy].lower_bound(mp(s[node].x - dist, -1));
          if (it != gy[yy].end() && it->x <= s[node].x + dist) {
            if (!was[it->y])
              was[it->y] = 1, Q.push(it->y);
            gy[yy].erase(it);
          } else
            break;
        } while (1);
      }
  }
  static vi g1[1 << 20];
  static vi g2[1 << 20];
  for (int i = 1; i <= n; ++i)
    g1[lower_bound(v.begin(), v.end(), s[i].x) - v.begin() + 1].pb(s[i].y),
        g2[lower_bound(v.begin(), v.end(), s[i].y) - v.begin() + 1].pb(s[i].x);
  for (int i = 1; i <= sz; ++i)
    sort(g1[i].begin(), g1[i].end()), sort(g2[i].begin(), g2[i].end());
  for (int i = 1; i <= n; ++i) {
    for (int j = -1; j < 2; ++j)
      if (j) {
        int xx =
            lower_bound(v.begin(), v.end(), s[i].x + j * dist) - v.begin() + 1;
        if (xx > sz || s[i].x + j * dist != v[xx - 1])
          continue;
        D[i] += lower_bound(g1[xx].begin(), g1[xx].end(), s[i].y + dist + 1) -
                lower_bound(g1[xx].begin(), g1[xx].end(), s[i].y - dist);
      }
    for (int j = -1; j < 2; ++j)
      if (j) {
        int yy =
            lower_bound(v.begin(), v.end(), s[i].y + j * dist) - v.begin() + 1;
        if (yy > sz || s[i].y + j * dist != v[yy - 1])
          continue;
        D[i] += lower_bound(g2[yy].begin(), g2[yy].end(), s[i].x + dist) -
                lower_bound(g2[yy].begin(), g2[yy].end(), s[i].x - dist + 1);
      }
  }
  int ans = 0;
  for (int i = 1; i <= n; ++i)
    ans += was[i] * D[i];
  ans /= 2;
  fo << ans << '\n';
  cerr << "Time elapsed :" << clock() * 1000.0 / CLOCKS_PER_SEC << " ms"
       << '\n';
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
#include <stdio.h>
using namespace std;
#define fi cin
#define fo cout
#define x first
#define y second
#define ll long long
#define IOS                                                                    \
  ios_base ::sync_with_stdio(0);                                               \
  cin.tie(0)
#define p(v) cerr << #v << " = " << v << '\n'
#define p2(v) cerr << #v << " = " << (complex<int>(v.x, v.y)) << '\n'
#define vi vector<int>
#define vl vector<ll>
#define pii pair<int, int>
#define mp make_pair
#define db long double
#define pb push_back
#define pdd pair<db, db>
#define int ll
int32_t main(void) {
#ifdef CF
  freopen("input", "r", stdin);
#endif // CF
  srand(time(0));
  fo << fixed << setprecision(7);
  cerr << fixed << setprecision(7);
  int n, a, b;
  IOS;
  fi >> n >> a >> b;
  static pii s[1 << 20];
  for (int i = 1; i <= n; ++i) {
    int xx, yy;
    fi >> xx >> yy;
    s[i].x = xx + yy;
    s[i].y = xx - yy;
  }
  vi v;
  for (int i = 1; i <= n; ++i)
    v.pb(s[i].x), v.pb(s[i].y);
  sort(v.begin(), v.end());
  v.resize(unique(v.begin(), v.end()) - v.begin());
  int sz = v.size();
  static int was[1 << 20];
  static int D[1 << 20];
  static int p[1 << 20];
  static multiset<pii> gx[1 << 20], gy[1 << 20];
  for (int i = 1; i <= n; ++i)
    gx[lower_bound(v.begin(), v.end(), s[i].x) - v.begin() + 1].insert(
        mp(s[i].y, i)),
        gy[lower_bound(v.begin(), v.end(), s[i].y) - v.begin() + 1].insert(
            mp(s[i].x, i));
  int dist = max(abs(s[a].x - s[b].x), abs(s[a].y - s[b].y));
  was[a] = was[b] = 1;
  queue<int> Q;
  Q.push(a);
  Q.push(b);
  while (!Q.empty()) {
    int node = Q.front();
    Q.pop();
    for (int i = -1; i < 2; ++i)
      if (i) {
        int xx = lower_bound(v.begin(), v.end(), s[node].x + i * dist) -
                 v.begin() + 1;
        if (xx > sz || s[node].x + i * dist != v[xx - 1])
          continue;
        do {
          auto it = gx[xx].lower_bound(mp(s[node].y - dist, -1));
          if (it != gx[xx].end() && it->x <= s[node].y + dist) {
            if (!was[it->y])
              was[it->y] = 1, Q.push(it->y);
            gx[xx].erase(it);
          } else
            break;
        } while (1);
      }
    for (int i = -1; i < 2; ++i)
      if (i) {
        int yy = lower_bound(v.begin(), v.end(), s[node].y + i * dist) -
                 v.begin() + 1;
        if (yy > sz || s[node].y + i * dist != v[yy - 1])
          continue;
        do {
          auto it = gy[yy].lower_bound(mp(s[node].x - dist, -1));
          if (it != gy[yy].end() && it->x <= s[node].x + dist) {
            if (!was[it->y])
              was[it->y] = 1, Q.push(it->y);
            gy[yy].erase(it);
          } else
            break;
        } while (1);
      }
  }
  static vi g1[1 << 20];
  static vi g2[1 << 20];
  for (int i = 1; i <= n; ++i)
    g1[lower_bound(v.begin(), v.end(), s[i].x) - v.begin() + 1].pb(s[i].y),
        g2[lower_bound(v.begin(), v.end(), s[i].y) - v.begin() + 1].pb(s[i].x);
  for (int i = 1; i <= sz; ++i)
    sort(g1[i].begin(), g1[i].end()), sort(g2[i].begin(), g2[i].end());
  for (int i = 1; i <= n; ++i) {
    for (int j = -1; j < 2; ++j)
      if (j) {
        int xx =
            lower_bound(v.begin(), v.end(), s[i].x + j * dist) - v.begin() + 1;
        if (xx > sz || s[i].x + j * dist != v[xx - 1])
          continue;
        D[i] += lower_bound(g1[xx].begin(), g1[xx].end(), s[i].y + dist + 1) -
                lower_bound(g1[xx].begin(), g1[xx].end(), s[i].y - dist);
      }
    for (int j = -1; j < 2; ++j)
      if (j) {
        int yy =
            lower_bound(v.begin(), v.end(), s[i].y + j * dist) - v.begin() + 1;
        if (yy > sz || s[i].y + j * dist != v[yy - 1])
          continue;
        D[i] += lower_bound(g2[yy].begin(), g2[yy].end(), s[i].x + dist) -
                lower_bound(g2[yy].begin(), g2[yy].end(), s[i].x - dist + 1);
      }
  }
  int ans = 0;
  for (int i = 1; i <= n; ++i)
    ans += was[i] * D[i];
  ans /= 2;
  fo << ans << '\n';
  cerr << "Time elapsed :" << clock() * 1000.0 / CLOCKS_PER_SEC << " ms"
       << '\n';
  return 0;
}