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

#include <algorithm>
#include <cmath>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
typedef long long lli;
typedef vector<lli> vll;
typedef vector<bool> vbl;
typedef vector<vector<lli>> mat;
typedef vector<vector<bool>> matb;
typedef vector<string> vst;
typedef pair<lli, lli> pll;
typedef pair<double, double> pdd;
typedef vll::iterator vitr;

const lli max_range = 1000000000;
const lli min_range = -1000000000;

lli n;
mat p;
lli q;
vll s, t;

vll k;
vll ans;
vll min_p, max_p;

void init() {
  k = vll(n);
  for (lli i = 0; i < n; i++)
    k[i] = i;
}

void make(vitr from, vitr to, int d) {
  if (from == to)
    return;
  sort(from, to, [d](lli a, lli b) { return p[a][d] < p[b][d]; });
  make(from, from + (to - from) / 2, (d + 1) % 2);
  make(from + (to - from) / 2 + 1, to, (d + 1) % 2);
}

bool contain(vll &a, vll &b, vll &s) {
  for (lli i = 0; i < 2; i++) {
    if (a[i] > s[i])
      return false;
    if (b[i] < s[i])
      return false;
  }
  return true;
}

void search(vll &s, vll &t, vll &a, vll &b, lli d, vitr from, vitr to) {
  if (from == to)
    return;
  if (contain(s, t, a) && contain(s, t, b)) {
    for (vitr itr = from; itr < to; itr++) {
      ans.push_back(*itr);
    }
    return;
  }
  for (lli i = 0; i < 2; i++) {
    if (a[i] > t[i])
      return;
    if (b[i] < s[i])
      return;
  }
  lli c = *(from + (to - from) / 2);
  lli l = p[c][d];
  if (contain(s, t, p[c]))
    ans.push_back(c);
  swap(b[d], l);
  search(s, t, a, b, !d, from, from + (to - from) / 2);
  swap(b[d], l);
  swap(a[d], l);
  search(s, t, a, b, !d, from + (to - from) / 2 + 1, to);
  swap(a[d], l);
}

int main() {
  cin >> n;
  p = mat(n, vll(2));
  for (lli i = 0; i < n; i++)
    scanf("%lld %lld", &p[i][0], &p[i][1]);
  s = vll(2);
  t = vll(2);
  init();
  make(k.begin(), k.end(), 0);
  min_p = vll(2, min_range);
  max_p = vll(2, max_range);
  cin >> q;
  for (lli i = 0; i < q; i++) {
    cin >> s[0] >> t[0] >> s[1] >> t[1];
    ans = vll();
    search(s, t, min_p, max_p, 0, k.begin(), k.end());
    sort(ans.begin(), ans.end());
    for (lli i = 0; i < ans.size(); i++)
      printf("%lld\\n", ans[i]);
    printf("\\n");
  }
  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <cmath>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
typedef long long lli;
typedef vector<lli> vll;
typedef vector<bool> vbl;
typedef vector<vector<lli>> mat;
typedef vector<vector<bool>> matb;
typedef vector<string> vst;
typedef pair<lli, lli> pll;
typedef pair<double, double> pdd;
typedef vll::iterator vitr;

const lli max_range = 1000000000;
const lli min_range = -1000000000;

lli n;
mat p;
lli q;
vll s, t;

vll k;
vll ans;
vll min_p, max_p;

void init() {
  k = vll(n);
  for (lli i = 0; i < n; i++)
    k[i] = i;
}

void make(vitr from, vitr to, int d) {
  if (from == to)
    return;
  sort(from, to, [d](lli a, lli b) { return p[a][d] < p[b][d]; });
  make(from, from + (to - from) / 2, (d + 1) % 2);
  make(from + (to - from) / 2 + 1, to, (d + 1) % 2);
}

bool contain(vll &a, vll &b, vll &s) {
  for (lli i = 0; i < 2; i++) {
    if (a[i] > s[i])
      return false;
    if (b[i] < s[i])
      return false;
  }
  return true;
}

void search(vll &s, vll &t, vll &a, vll &b, lli d, vitr from, vitr to) {
  if (from == to)
    return;
  if (contain(s, t, a) && contain(s, t, b)) {
    for (vitr itr = from; itr < to; itr++) {
      ans.push_back(*itr);
    }
    return;
  }
  for (lli i = 0; i < 2; i++) {
    if (a[i] > t[i])
      return;
    if (b[i] < s[i])
      return;
  }
  lli c = *(from + (to - from) / 2);
  lli l = p[c][d];
  if (contain(s, t, p[c]))
    ans.push_back(c);
  swap(b[d], l);
  search(s, t, a, b, !d, from, from + (to - from) / 2);
  swap(b[d], l);
  swap(a[d], l);
  search(s, t, a, b, !d, from + (to - from) / 2 + 1, to);
  swap(a[d], l);
}

int main() {
  cin >> n;
  p = mat(n, vll(2));
  for (lli i = 0; i < n; i++)
    cin >> p[i][0] >> p[i][1];
  s = vll(2);
  t = vll(2);
  init();
  make(k.begin(), k.end(), 0);
  min_p = vll(2, min_range);
  max_p = vll(2, max_range);
  cin >> q;
  for (lli i = 0; i < q; i++) {
    cin >> s[0] >> t[0] >> s[1] >> t[1];
    ans = vll();
    search(s, t, min_p, max_p, 0, k.begin(), k.end());
    sort(ans.begin(), ans.end());
    for (lli i = 0; i < ans.size(); i++)
      printf("%lld\\n", ans[i]);
    cout << endl;
  }
  return 0;
}