Problem p02347 (C++)

Buggy submission (status: Runtime Error):
#include <iostream>
using namespace std;
#include <algorithm> // sort.
#include <cstdio>    // scanf, printf.
#include <utility>   // pair.

typedef pair<int, pair<int, int>> Point;

inline int pos_x(Point p) { return p.second.first; }
inline int pos_y(Point p) { return p.second.second; }

bool cmp_x(const Point &p1, const Point &p2) { return pos_x(p1) < pos_x(p2); }
bool cmp_y(const Point &p1, const Point &p2) { return pos_y(p1) < pos_y(p2); }

class Node {
public:
  Point *mark;
  Node *less, *more;
  int depth;
  Node() : mark(NULL), less(NULL), more(NULL), depth(0){};
  Node(Point *pos, Node *l, Node *m, int d)
      : mark(pos), less(l), more(m), depth(d){};
};

Node *make_tree(Point S[], int left, int right, int d) {
  if (left > right)
    return NULL;
  if (left == right) {
    Node *leaf = new Node;
    *leaf = Node(&S[left], NULL, NULL, d);
    return leaf;
  }

  if (d & 1) {
    sort(S + left, S + right + 1, cmp_x);
  } else {
    sort(S + left, S + right + 1, cmp_y);
  }
  int mid = (left + right) / 2;

  Node *kd_n = new Node;
  kd_n->mark = &S[mid];
  kd_n->less = make_tree(S, left, mid - 1, d + 1);
  kd_n->more = make_tree(S, mid + 1, right, d + 1);
  kd_n->depth = d;

  return kd_n;
}

int cnt;

void search_points(Point S[], int sx, int tx, int sy, int ty, Node *kd_n) {
  if (kd_n == NULL)
    return;
  int a = pos_x(*(kd_n->mark)), b = pos_y(*(kd_n->mark));

  if (sx <= a && a <= tx && sy <= b && b <= ty) {
    S[cnt] = *(kd_n->mark);
    cnt++;
  }
  int d = kd_n->depth;

  if (d & 1) {
    if (sx <= a) {
      search_points(S, sx, tx, sy, ty, kd_n->less);
    }
    if (a <= tx) {
      search_points(S, sx, tx, sy, ty, kd_n->more);
    }
  } else {
    if (sy <= b) {
      search_points(S, sx, tx, sy, ty, kd_n->less);
    }
    if (b <= ty) {
      search_points(S, sx, tx, sy, ty, kd_n->more);
    }
  }
  return;
}

int main() {
  int i, a, b, n;
  Point P[500], Q[100];

  scanf("%d", &n);
  for (i = 0; i < n; i++) {
    scanf("%d %d", &a, &b);
    P[i] = make_pair(i, make_pair(a, b));
  }
  Node *root;
  root = make_tree(P, 0, n - 1, 0);

  int q, sx, tx, sy, ty;
  scanf("%d", &q);
  while (q) {
    cnt = 0;
    scanf("%d %d %d %d", &sx, &tx, &sy, &ty);
    search_points(Q, sx, tx, sy, ty, root);
    sort(Q, Q + cnt);
    for (i = 0; i < cnt; i++) {
      printf("%d\n", Q[i].first);
    }
    printf("\n");
    q--;
  }
  return 0;
}

Fixed submission:
#include <iostream>
using namespace std;
#include <algorithm> // sort.
#include <cstdio>    // scanf, printf.
#include <utility>   // pair.

typedef pair<int, pair<int, int>> Point;

inline int pos_x(Point p) { return p.second.first; }
inline int pos_y(Point p) { return p.second.second; }

bool cmp_x(const Point &p1, const Point &p2) { return pos_x(p1) < pos_x(p2); }
bool cmp_y(const Point &p1, const Point &p2) { return pos_y(p1) < pos_y(p2); }

class Node {
public:
  Point *mark;
  Node *less, *more;
  int depth;
  Node() : mark(NULL), less(NULL), more(NULL), depth(0){};
  Node(Point *pos, Node *l, Node *m, int d)
      : mark(pos), less(l), more(m), depth(d){};
};

Node *make_tree(Point S[], int left, int right, int d) {
  if (left > right)
    return NULL;
  if (left == right) {
    Node *leaf = new Node;
    *leaf = Node(&S[left], NULL, NULL, d);
    return leaf;
  }

  if (d & 1) {
    sort(S + left, S + right + 1, cmp_x);
  } else {
    sort(S + left, S + right + 1, cmp_y);
  }
  int mid = (left + right) / 2;

  Node *kd_n = new Node;
  kd_n->mark = &S[mid];
  kd_n->less = make_tree(S, left, mid - 1, d + 1);
  kd_n->more = make_tree(S, mid + 1, right, d + 1);
  kd_n->depth = d;

  return kd_n;
}

int cnt;

void search_points(Point S[], int sx, int tx, int sy, int ty, Node *kd_n) {
  if (kd_n == NULL)
    return;
  int a = pos_x(*(kd_n->mark)), b = pos_y(*(kd_n->mark));

  if (sx <= a && a <= tx && sy <= b && b <= ty) {
    S[cnt] = *(kd_n->mark);
    cnt++;
  }
  int d = kd_n->depth;

  if (d & 1) {
    if (sx <= a) {
      search_points(S, sx, tx, sy, ty, kd_n->less);
    }
    if (a <= tx) {
      search_points(S, sx, tx, sy, ty, kd_n->more);
    }
  } else {
    if (sy <= b) {
      search_points(S, sx, tx, sy, ty, kd_n->less);
    }
    if (b <= ty) {
      search_points(S, sx, tx, sy, ty, kd_n->more);
    }
  }
  return;
}

int main() {
  int i, a, b, n;
  Point P[500000], Q[100];

  scanf("%d", &n);
  for (i = 0; i < n; i++) {
    scanf("%d %d", &a, &b);
    P[i] = make_pair(i, make_pair(a, b));
  }
  Node *root;
  root = make_tree(P, 0, n - 1, 0);

  int q, sx, tx, sy, ty;
  scanf("%d", &q);
  while (q) {
    cnt = 0;
    scanf("%d %d %d %d", &sx, &tx, &sy, &ty);
    search_points(Q, sx, tx, sy, ty, root);
    sort(Q, Q + cnt);
    for (i = 0; i < cnt; i++) {
      printf("%d\n", Q[i].first);
    }
    printf("\n");
    q--;
  }
  return 0;
}