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

#include <bits/stdc++.h>
#include <sys/types.h>
#include <unistd.h>

#define _overload(_1, _2, _3, name, ...) name
#define _rep(i, n) _range(i, 0, n)
#define _range(i, a, b) for (int i = int(a); i < int(b); ++i)
#define rep(...) _overload(__VA_ARGS__, _range, _rep, )(__VA_ARGS__)

#define _rrep(i, n) _rrange(i, n, 0)
#define _rrange(i, a, b) for (int i = int(a) - 1; i >= int(b); --i)
#define rrep(...) _overload(__VA_ARGS__, _rrange, _rrep, )(__VA_ARGS__)

#define _all(arg) begin(arg), end(arg)
#define uniq(arg) sort(_all(arg)), (arg).erase(unique(_all(arg)), end(arg))
#define getidx(ary, key) lower_bound(_all(ary), key) - begin(ary)
#define clr(a, b) memset((a), (b), sizeof(a))
#define bit(n) (1LL << (n))
#define popcount(n) (__builtin_popcountll(n))

using namespace std;

template <class T> bool chmax(T &a, const T &b) {
  return (a < b) ? (a = b, 1) : 0;
}
template <class T> bool chmin(T &a, const T &b) {
  return (b < a) ? (a = b, 1) : 0;
}

using ll = long long;
using R = long double;
const R EPS = 1e-9L; // [-1000,1000]->EPS=1e-8 [-10000,10000]->EPS=1e-7
inline int sgn(const R &r) { return (r > EPS) - (r < -EPS); }
inline R sq(R x) { return sqrt(max(x, 0.0L)); }

const pid_t pid = getpid();
// Problem Specific Parameter:

const int half = 11;
const int inf = 1 << 30;
const int limit = 1 << 18;
int v[limit], w[limit];

using pii = pair<int, int>;
vector<pii> query[limit];

int ans[limit];

vector<int> pre, post;
vector<pii> ary[20];

void pre_calc() {
  const int n = pre.size();

  ary[n].clear();
  rep(mask, 1 << n) {
    int cv = 0, cw = 0;
    rep(i, n) {
      if ((mask >> i) & 1) {
        cv += v[pre[i]];
        cw += w[pre[i]];
      }
    }
    ary[n].push_back(pii(cw, cv));
  }

  sort(begin(ary[n]), end(ary[n]));
  const int an = ary[n].size();
  rep(i, 1, an) chmax(ary[n][i].second, ary[n][i - 1].second);
}

void calc(int l, int p) {
  int &res = ans[p];
  const int n = pre.size();
  const int m = post.size();

  rep(mask, 1 << m) {
    int cv = 0, cw = 0;
    rep(i, m) {
      if ((mask >> i) & 1) {
        cv += v[post[i]];
        cw += w[post[i]];
      }
    }
    if (cw > l)
      continue;
    chmax(res, cv);
    auto it = prev(upper_bound(begin(ary[n]), end(ary[n]), pii(l - cw, inf)));
    chmax(res, cv + it->second);
  }
}

void dfs(int v, int d, int n) {
  if (v >= n)
    return;

  if (d < half) {
    pre.push_back(v);
    pre_calc();
  } else {
    post.push_back(v);
  }

  for (auto &elem : query[v]) {
    calc(elem.first, elem.second);
  }

  dfs(2 * v + 1, d + 1, n);
  dfs(2 * v + 2, d + 1, n);

  if (d < half) {
    pre.pop_back();
  } else {
    post.pop_back();
  }
}

int main(void) {
  int n;
  cin >> n;
  rep(i, n) cin >> v[i] >> w[i];

  int q;
  cin >> q;
  rep(i, q) {
    int t, l;
    cin >> t >> l;
    t--;
    query[t].push_back(pii(l, i));
  }

  dfs(0, 0, n);

  rep(i, q) cout << ans[i] << endl;
  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#include <sys/types.h>
#include <unistd.h>

#define _overload(_1, _2, _3, name, ...) name
#define _rep(i, n) _range(i, 0, n)
#define _range(i, a, b) for (int i = int(a); i < int(b); ++i)
#define rep(...) _overload(__VA_ARGS__, _range, _rep, )(__VA_ARGS__)

#define _rrep(i, n) _rrange(i, n, 0)
#define _rrange(i, a, b) for (int i = int(a) - 1; i >= int(b); --i)
#define rrep(...) _overload(__VA_ARGS__, _rrange, _rrep, )(__VA_ARGS__)

#define _all(arg) begin(arg), end(arg)
#define uniq(arg) sort(_all(arg)), (arg).erase(unique(_all(arg)), end(arg))
#define getidx(ary, key) lower_bound(_all(ary), key) - begin(ary)
#define clr(a, b) memset((a), (b), sizeof(a))
#define bit(n) (1LL << (n))
#define popcount(n) (__builtin_popcountll(n))

using namespace std;

template <class T> bool chmax(T &a, const T &b) {
  return (a < b) ? (a = b, 1) : 0;
}
template <class T> bool chmin(T &a, const T &b) {
  return (b < a) ? (a = b, 1) : 0;
}

using ll = long long;
using R = long double;
const R EPS = 1e-9L; // [-1000,1000]->EPS=1e-8 [-10000,10000]->EPS=1e-7
inline int sgn(const R &r) { return (r > EPS) - (r < -EPS); }
inline R sq(R x) { return sqrt(max(x, 0.0L)); }

template <typename T> vector<T> make_vector(size_t sz) { return vector<T>(sz); }

template <typename T, typename... Ts> auto make_vector(size_t sz, Ts... ts) {
  return vector<decltype(make_vector<T>(ts...))>(sz, make_vector<T>(ts...));
}

template <typename T, typename U, typename... V>
typename enable_if<is_same<T, U>::value != 0>::type fill_value(U &u,
                                                               const V... v) {
  u = U(v...);
}

template <typename T, typename U, typename... V>
typename enable_if<is_same<T, U>::value == 0>::type fill_value(U &u,
                                                               const V... v) {
  for (auto &e : u) {
    fill_value<T>(e, v...);
  }
}

const int dx[8] = {1, 0, -1, 0, 1, -1, -1, 1};
const int dy[8] = {0, 1, 0, -1, 1, 1, -1, -1};

const pid_t pid = getpid();
// Problem Specific Parameter:

const int half = 9;
const int inf = 1 << 30;
const int limit = 1 << 18;
int v[limit], w[limit];

using pii = pair<int, int>;
vector<pii> query[limit];
int ans[limit];

vector<int> pre, post;

void calc(int l, int p) {
  int &res = ans[p];

  const int n = pre.size();
  const int m = post.size();

  vector<pii> ary;

  rep(mask, 1 << n) {
    int cv = 0, cw = 0;
    rep(i, n) {
      if ((mask >> i) & 1) {
        cv += v[pre[i]];
        cw += w[pre[i]];
      }
    }
    if (cw <= l)
      chmax(res, cv);
    ary.push_back(pii(cw, cv));
  }

  sort(begin(ary), end(ary));
  const int an = ary.size();
  rep(i, 1, an) chmax(ary[i].second, ary[i - 1].second);

  rep(mask, 1 << m) {
    int cv = 0, cw = 0;
    rep(i, m) {
      if ((mask >> i) & 1) {
        cv += v[post[i]];
        cw += w[post[i]];
      }
    }
    if (cw <= l)
      chmax(res, cv);
    auto it = prev(upper_bound(begin(ary), end(ary), pii(l - cw, inf)));
    chmax(res, cv + it->second);
  }
}

void dfs(int v, int d, int n) {
  if (v >= n)
    return;

  if (d < half) {
    pre.push_back(v);
  } else {
    post.push_back(v);
  }

  for (auto &elem : query[v]) {
    calc(elem.first, elem.second);
  }

  dfs(2 * v + 1, d + 1, n);
  dfs(2 * v + 2, d + 1, n);

  if (d < half) {
    pre.pop_back();
  } else {
    post.pop_back();
  }
}

int main(void) {
  int n;
  cin >> n;
  rep(i, n) cin >> v[i] >> w[i];

  int q;
  cin >> q;
  rep(i, q) {
    int t, l;
    cin >> t >> l;
    t--;
    query[t].push_back(pii(l, i));
  }

  dfs(0, 0, n);

  rep(i, q) cout << ans[i] << endl;
  return 0;
}