Problem p02347 (C++) — buggy submission, verdict: Runtime Error

#include <algorithm>
#include <cstring>
#include <iostream>
#include <list>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <vector>

using namespace std;

struct pNode {
  int id, x, y;
  pNode() {} // 必不可少
  pNode(int id_, int x_, int y_) : id(id_), x(x_), y(y_) {}
};
struct Node {
  int depth;
  pNode data;
  Node *l, *r;
};
int n, sx, tx, sy, ty;
static const int maxn = 500010;
int len;
int ans[maxn];
pNode g[maxn];

bool cmpx(pNode a, pNode b) { return a.x < b.x; }
bool cmpy(pNode a, pNode b) { return a.y < b.y; }
void build(Node *&p, int depth, int left, int right) {
  if (left > right)
    return;
  int mid = (left + right) / 2;
  if (depth % 2 == 0)
    sort(g + left, g + right + 1, cmpx);
  else
    sort(g + left, g + right + 1, cmpy);
  p = (Node *)malloc(sizeof(Node));
  p->depth = depth;
  p->data = g[mid];
  p->l = NULL, p->r = NULL;
  build(p->l, depth + 1, left, mid - 1);
  build(p->r, depth + 1, mid + 1, right);
}

void find_range(Node *&p) {
  if (p == NULL)
    return;
  int x = p->data.x;
  int y = p->data.y;
  if (x >= sx && x <= tx && y >= sy && y <= ty) {
    ans[len++] = p->data.id;
  }
  if (p->depth % 2 == 0) {
    if (x >= sx)
      find_range(p->l);
    if (x <= tx)
      find_range(p->r);
  } else {
    if (y >= sy)
      find_range(p->l);
    if (y <= ty)
      find_range(p->r);
  }
}
int main() {
  int i, j, q;
  Node *tree = NULL;
  scanf("%d", &n);
  for (i = 0; i < n; i++) {
    scanf("%d %d", &g[i].x, &g[i].y);
    g[i].id = i;
  }
  build(tree, 0, 0, n - 1);
  scanf("%d", &q);
  for (i = 0; i < q; i++) {
    scanf("%d%d%d%d", &sx, &tx, &sy, &ty);
    len = 0;
    find_range(tree);
    sort(ans, ans + len);
    for (j = 0; j < len; j++)
      printf("%d\\n", ans[j]);
    printf("\\n");
  }
  return 0;
}


Error: WA

Fixed submission:

#include <algorithm>
#include <cstring>
#include <iostream>
#include <list>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <vector>

using namespace std;

struct pNode {
  int id, x, y;
  pNode() {} // 必不可少
  pNode(int id_, int x_, int y_) : id(id_), x(x_), y(y_) {}
};
struct Node {
  int depth;
  pNode data;
  Node *l, *r;
};
int n, sx, tx, sy, ty;
static const int maxn = 200010;
int len;
int ans[maxn];
pNode g[maxn];

bool cmpx(pNode a, pNode b) { return a.x < b.x; }
bool cmpy(pNode a, pNode b) { return a.y < b.y; }
void build(Node *&p, int depth, int left, int right) {
  if (left > right)
    return;
  int mid = (left + right) / 2;
  if (depth % 2 == 0)
    sort(g + left, g + right + 1, cmpx);
  else
    sort(g + left, g + right + 1, cmpy);
  p = (Node *)malloc(sizeof(Node));
  p->depth = depth;
  p->data = g[mid];
  p->l = NULL, p->r = NULL;
  build(p->l, depth + 1, left, mid - 1);
  build(p->r, depth + 1, mid + 1, right);
}

void preorder(Node *p) {
  if (p != NULL) {
    printf("%d %d \\n", p->data.x, p->data.y);
    preorder(p->l);
    preorder(p->r);
  }
}

void find_range(Node *&p) {
  if (p == NULL)
    return;
  int x = p->data.x;
  int y = p->data.y;
  if (x >= sx && x <= tx && y >= sy && y <= ty) {
    ans[len++] = p->data.id;
  }
  if (p->depth % 2 == 0) {
    if (x >= sx)
      find_range(p->l);
    if (x <= tx)
      find_range(p->r);
  } else {
    if (y >= sy)
      find_range(p->l);
    if (y <= ty)
      find_range(p->r);
  }
}
int main() {
  int i, j, q;
  Node *tree = NULL;
  scanf("%d", &n);
  for (i = 0; i < n; i++) {
    scanf("%d %d", &g[i].x, &g[i].y);
    g[i].id = i;
  }
  build(tree, 0, 0, n - 1);
  scanf("%d", &q);
  for (i = 0; i < q; i++) {
    scanf("%d%d%d%d", &sx, &tx, &sy, &ty);
    len = 0;
    find_range(tree);
    sort(ans, ans + len);
    for (j = 0; j < len; j++)
      printf("%d\\n", ans[j]);
    printf("\\n");
  }
  return 0;
}