Problem p03858 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int n, a, b;
ll x[N], y[N], X[N], Y[N], ax[N], ay[N], dis;
set<pair<ll, int>> Sx[N], Sy[N];
set<pair<ll, ll>> S;
vector<ll> vx[N], vy[N];
queue<int> Q;
int q[N], size;
void push(int i) {
  static bool inq[N];
  if (inq[i])
    return;
  inq[i] = 1;
  Q.push(i);
  q[++size] = i;
}
ll ans = 0;
void calc(vector<ll> &v, ll l, ll r) {
  /*for (int i=0;i<v.size();i++) printf("%lld ",v[i]);puts("");
  printf("query(%lld,%lld)\n",l,r);*/
  int cnt =
      upper_bound(v.begin(), v.end(), r) - lower_bound(v.begin(), v.end(), l);
  // printf("ans=%d\n",cnt);
  ans += cnt;
}
void work(set<pair<ll, int>> &S, ll l, ll r) {
  S.insert(make_pair(l, 0));
  S.insert(make_pair(r + 1, 0));
  set<pair<ll, int>>::iterator i = S.find(make_pair(l, 0));
  set<pair<ll, int>>::iterator R = S.find(make_pair(r + 1, 0));
  for (++i; i != R; ++i)
    push(i->second);
  S.erase(make_pair(l, 0));
  S.erase(make_pair(r + 1, 0));
}
void release(int i) {
  // printf("release %d\n",i);
  ll lx = x[i] + y[i] - dis, rx = x[i] + y[i] + dis;
  ll ly = x[i] - y[i] - dis, ry = x[i] - y[i] + dis;
  size = 0;
  int id = lower_bound(ax + 1, ax + n + 1, lx) - ax;
  if (ax[id] == lx)
    calc(vx[id], ly, ry), work(Sx[id], ly, ry);
  id = lower_bound(ax + 1, ax + n + 1, rx) - ax;
  if (ax[id] == rx)
    calc(vx[id], ly, ry), work(Sx[id], ly, ry);
  id = lower_bound(ay + 1, ay + n + 1, ly) - ay;
  if (ay[id] == ly)
    calc(vy[id], lx, rx), work(Sy[id], lx, rx);
  id = lower_bound(ay + 1, ay + n + 1, ry) - ay;
  if (ay[id] == ry)
    calc(vy[id], lx, rx), work(Sy[id], lx, rx);
  if (S.count(make_pair(lx, ly)))
    ans--;
  if (S.count(make_pair(lx, ry)))
    ans--;
  if (S.count(make_pair(rx, ly)))
    ans--;
  if (S.count(make_pair(rx, ry)))
    ans--;
  for (int i = 1; i <= size; i++) {
    int v = q[i];
    Sx[X[v]].erase(make_pair(Y[v], v));
    Sy[Y[v]].erase(make_pair(X[v], v));
    // printf("find %d\n",v);
  }
}
int main() {
  scanf("%d%d%d", &n, &a, &b);
  for (int i = 1; i <= n; i++) {
    scanf("%lld%lld", &x[i], &y[i]);
    ax[i] = X[i] = x[i] + y[i];
    ay[i] = Y[i] = x[i] - y[i];
    S.insert(make_pair(X[i], Y[i]));
  }
  sort(ax + 1, ax + n + 1);
  sort(ay + 1, ay + n + 1);
  for (int i = 1; i <= n; i++) {
    X[i] = lower_bound(ax + 1, ax + n + 1, X[i]) - ax;
    Y[i] = lower_bound(ay + 1, ay + n + 1, Y[i]) - ay;
    Sx[X[i]].insert(make_pair(x[i] - y[i], i));
    Sy[Y[i]].insert(make_pair(x[i] + y[i], i));
    vx[X[i]].push_back(x[i] - y[i]);
    vy[Y[i]].push_back(x[i] + y[i]);
  }
  for (int i = 1; i <= n; i++) {
    vx[i].push_back(-1e16);
    vx[i].push_back(1e16);
    vy[i].push_back(-1e16);
    vy[i].push_back(1e16);
  }
  for (int i = 1; i <= n; i++) {
    sort(vx[i].begin(), vx[i].end());
    sort(vy[i].begin(), vy[i].end());
  }
  push(a);
  push(b);
  dis = abs(x[a] - x[b]) + abs(y[a] - y[b]);
  while (!Q.empty())
    release(Q.front()), Q.pop();
  printf("%lld\n", ans / 2);
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int n, a, b;
ll x[N], y[N], X[N], Y[N], ax[N], ay[N], dis;
set<pair<ll, int>> Sx[N], Sy[N];
set<pair<ll, ll>> S;
vector<ll> vx[N], vy[N];
queue<int> Q;
int q[N], size;
void push(int i) {
  static bool inq[N];
  if (inq[i])
    return;
  inq[i] = 1;
  Q.push(i);
  q[++size] = i;
}
ll ans = 0;
void calc(vector<ll> &v, ll l, ll r) {
  /*for (int i=0;i<v.size();i++) printf("%lld ",v[i]);puts("");
  printf("query(%lld,%lld)\n",l,r);*/
  int cnt =
      upper_bound(v.begin(), v.end(), r) - lower_bound(v.begin(), v.end(), l);
  // printf("ans=%d\n",cnt);
  ans += cnt;
}
void work(set<pair<ll, int>> &S, ll l, ll r) {
  S.insert(make_pair(l, 0));
  S.insert(make_pair(r + 1, 0));
  set<pair<ll, int>>::iterator i = S.find(make_pair(l, 0));
  set<pair<ll, int>>::iterator R = S.find(make_pair(r + 1, 0));
  for (++i; i != R; ++i)
    push(i->second);
  S.erase(make_pair(l, 0));
  S.erase(make_pair(r + 1, 0));
}
void release(int i) {
  // printf("release %d\n",i);
  ll lx = x[i] + y[i] - dis, rx = x[i] + y[i] + dis;
  ll ly = x[i] - y[i] - dis, ry = x[i] - y[i] + dis;
  size = 0;
  int id = lower_bound(ax + 1, ax + n + 1, lx) - ax;
  if (ax[id] == lx)
    calc(vx[id], ly, ry), work(Sx[id], ly, ry);
  id = lower_bound(ax + 1, ax + n + 1, rx) - ax;
  if (ax[id] == rx)
    calc(vx[id], ly, ry), work(Sx[id], ly, ry);
  id = lower_bound(ay + 1, ay + n + 1, ly) - ay;
  if (ay[id] == ly)
    calc(vy[id], lx, rx), work(Sy[id], lx, rx);
  id = lower_bound(ay + 1, ay + n + 1, ry) - ay;
  if (ay[id] == ry)
    calc(vy[id], lx, rx), work(Sy[id], lx, rx);
  if (S.count(make_pair(lx, ly)))
    ans--;
  if (S.count(make_pair(lx, ry)))
    ans--;
  if (S.count(make_pair(rx, ly)))
    ans--;
  if (S.count(make_pair(rx, ry)))
    ans--;
  for (int i = 1; i <= size; i++) {
    int v = q[i];
    Sx[X[v]].erase(make_pair(x[v] - y[v], v));
    Sy[Y[v]].erase(make_pair(x[v] + y[v], v));
    // printf("find %d\n",v);
  }
}
int main() {
  scanf("%d%d%d", &n, &a, &b);
  for (int i = 1; i <= n; i++) {
    scanf("%lld%lld", &x[i], &y[i]);
    ax[i] = X[i] = x[i] + y[i];
    ay[i] = Y[i] = x[i] - y[i];
    S.insert(make_pair(X[i], Y[i]));
  }
  sort(ax + 1, ax + n + 1);
  sort(ay + 1, ay + n + 1);
  for (int i = 1; i <= n; i++) {
    X[i] = lower_bound(ax + 1, ax + n + 1, X[i]) - ax;
    Y[i] = lower_bound(ay + 1, ay + n + 1, Y[i]) - ay;
    Sx[X[i]].insert(make_pair(x[i] - y[i], i));
    Sy[Y[i]].insert(make_pair(x[i] + y[i], i));
    vx[X[i]].push_back(x[i] - y[i]);
    vy[Y[i]].push_back(x[i] + y[i]);
  }
  for (int i = 1; i <= n; i++) {
    vx[i].push_back(-1e16);
    vx[i].push_back(1e16);
    vy[i].push_back(-1e16);
    vy[i].push_back(1e16);
  }
  for (int i = 1; i <= n; i++) {
    sort(vx[i].begin(), vx[i].end());
    sort(vy[i].begin(), vy[i].end());
  }
  push(a);
  push(b);
  dis = abs(x[a] - x[b]) + abs(y[a] - y[b]);
  while (!Q.empty())
    release(Q.front()), Q.pop();
  printf("%lld\n", ans / 2);
  return 0;
}