Problem p02347 (C++) — buggy submission, verdict: Memory Limit Exceeded

#include <bits/stdc++.h>
using namespace std;
const int sz = 1 << 16;
typedef pair<unsigned short, int> Pi;
vector<Pi> seg[2 * sz + 1];
int x[500000], y[500000];
int sx[20000], sy[20000], tx[20000], ty[20000];
vector<pair<unsigned short, Pi>> buff;
vector<int> nums, nums2;
vector<int> ret;
void InitRange(int k, int l, int r) {
  if (l + 1 >= r) {
    return;
  } else {
    InitRange(2 * k + 1, l, (l + r) >> 1);
    InitRange(2 * k + 2, (l + r) >> 1, r);
    if (k >= 114) {
      seg[k].resize(seg[2 * k + 1].size() + seg[2 * k + 2].size());
      merge(seg[2 * k + 1].begin(), seg[2 * k + 1].end(),
            seg[2 * k + 2].begin(), seg[2 * k + 2].end(), seg[k].begin());
    }
  }
}
void PrintRange(unsigned short a, unsigned short b, unsigned short low,
                unsigned short high, int k, int l, int r) {
  if (a >= r || b <= l) {
    return;
  } else if (a <= l && r <= b && k >= 114) {
    for (vector<Pi>::iterator it =
             lower_bound(seg[k].begin(), seg[k].end(), Pi(low, -1));
         it != seg[k].end() && it->first < high; it++) {
      ret.push_back(it->second);
    }
  } else {
    PrintRange(a, b, low, high, 2 * k + 1, l, (l + r) >> 1);
    PrintRange(a, b, low, high, 2 * k + 2, (l + r) >> 1, r);
  }
}

int main() {
  int n, q;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    scanf("%d %d", &x[i], &y[i]);
  }
  scanf("%d", &q);
  for (int i = 0; i < q; i++) {
    scanf("%d %d %d %d", &sx[i], &tx[i], &sy[i], &ty[i]);
    nums.push_back(sx[i] - 1);
    nums.push_back(tx[i]);
    nums2.push_back(sy[i] - 1);
    nums2.push_back(ty[i]);
  }
  sort(nums.begin(), nums.end());
  nums.erase(unique(nums.begin(), nums.end()), nums.end());
  sort(nums2.begin(), nums2.end());
  nums2.erase(unique(nums2.begin(), nums2.end()), nums2.end());
  for (int i = 0; i < n; i++) {
    x[i] = lower_bound(nums.begin(), nums.end(), x[i]) - nums.begin();
    y[i] = lower_bound(nums2.begin(), nums2.end(), y[i]) - nums2.begin();
    buff.push_back(make_pair(x[i], make_pair(y[i], i)));
  }
  sort(buff.begin(), buff.end());
  for (int i = 0; i < n; i++) {
    seg[buff[i].first + sz - 1].push_back(buff[i].second);
  }
  InitRange(0, 0, sz);

  for (int i = 0; i < q; i++) {
    sx[i] = lower_bound(nums.begin(), nums.end(), sx[i]) - nums.begin();
    tx[i] = upper_bound(nums.begin(), nums.end(), tx[i]) - nums.begin();
    sy[i] = lower_bound(nums2.begin(), nums2.end(), sy[i]) - nums2.begin();
    ty[i] = upper_bound(nums2.begin(), nums2.end(), ty[i]) - nums2.begin();

    PrintRange(sx[i], tx[i], sy[i], ty[i], 0, 0, sz);
    sort(ret.begin(), ret.end());
    for (vector<int>::const_iterator it = ret.begin(); it != ret.end(); it++) {
      printf("%d\\n", *it);
    }
    printf("\\n");
    ret.clear();
  }
}

Error: MLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
const int sz = 1 << 16;
typedef pair<unsigned short, int> Pi;
vector<Pi> seg[2 * sz + 1];
int x[500000], y[500000];
int sx[20000], sy[20000], tx[20000], ty[20000];
vector<pair<unsigned short, Pi>> buff;
vector<int> nums, nums2;
vector<int> ret;
void InitRange(int k, int l, int r) {
  if (l + 1 >= r) {
    return;
  } else {
    InitRange(2 * k + 1, l, (l + r) >> 1);
    InitRange(2 * k + 2, (l + r) >> 1, r);
    seg[k].resize(seg[2 * k + 1].size() + seg[2 * k + 2].size());
    if (k >= 10000)
      merge(seg[2 * k + 1].begin(), seg[2 * k + 1].end(),
            seg[2 * k + 2].begin(), seg[2 * k + 2].end(), seg[k].begin());
  }
}

void PrintRange(unsigned short a, unsigned short b, unsigned short low,
                unsigned short high, int k, int l, int r) {
  if (a >= r || b <= l) {
    return;
  } else if (a <= l && r <= b && k > 10000) {
    for (vector<Pi>::iterator it =
             lower_bound(seg[k].begin(), seg[k].end(), Pi(low, -1));
         it != seg[k].end() && it->first < high; it++) {
      ret.push_back(it->second);
    }
  } else {
    PrintRange(a, b, low, high, 2 * k + 1, l, (l + r) >> 1);
    PrintRange(a, b, low, high, 2 * k + 2, (l + r) >> 1, r);
  }
}

int main() {
  int n, q;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    scanf("%d %d", &x[i], &y[i]);
  }
  scanf("%d", &q);
  for (int i = 0; i < q; i++) {
    scanf("%d %d %d %d", &sx[i], &tx[i], &sy[i], &ty[i]);
    nums.push_back(sx[i] - 1);
    nums.push_back(tx[i]);
    nums2.push_back(sy[i] - 1);
    nums2.push_back(ty[i]);
  }
  sort(nums.begin(), nums.end());
  nums.erase(unique(nums.begin(), nums.end()), nums.end());
  sort(nums2.begin(), nums2.end());
  nums2.erase(unique(nums2.begin(), nums2.end()), nums2.end());
  for (int i = 0; i < n; i++) {
    x[i] = lower_bound(nums.begin(), nums.end(), x[i]) - nums.begin();
    y[i] = lower_bound(nums2.begin(), nums2.end(), y[i]) - nums2.begin();
    buff.push_back(make_pair(x[i], make_pair(y[i], i)));
  }
  sort(buff.begin(), buff.end());
  for (int i = 0; i < n; i++) {
    seg[buff[i].first + sz - 1].push_back(buff[i].second);
  }
  InitRange(0, 0, sz);

  for (int i = 0; i < q; i++) {
    sx[i] = lower_bound(nums.begin(), nums.end(), sx[i]) - nums.begin();
    tx[i] = upper_bound(nums.begin(), nums.end(), tx[i]) - nums.begin();
    sy[i] = lower_bound(nums2.begin(), nums2.end(), sy[i]) - nums2.begin();
    ty[i] = upper_bound(nums2.begin(), nums2.end(), ty[i]) - nums2.begin();

    PrintRange(sx[i], tx[i], sy[i], ty[i], 0, 0, sz);
    sort(ret.begin(), ret.end());
    for (vector<int>::const_iterator it = ret.begin(); it != ret.end(); it++) {
      printf("%d\\n", *it);
    }
    printf("\\n");
    ret.clear();
  }
}