Problem p02648 (C++)

Buggy submission (status: Time Limit Exceeded):
#include "bits/stdc++.h"
#include "ext/pb_ds/assoc_container.hpp"
#include "ext/pb_ds/tree_policy.hpp"
#include "ext/rope"
using namespace std;
using namespace chrono;
using namespace __gnu_pbds;
using namespace __gnu_cxx;
mt19937 rng(high_resolution_clock::now().time_since_epoch().count());
mt19937_64 rngll(high_resolution_clock::now().time_since_epoch().count());
#define lambdify(x)                                                            \
  [&](auto &&...args) { return x(forward<decltype(args)>(args)...); }
template <typename T, typename U> T &ctmax(T &x, const U &y) {
  return x = max<T>(x, y);
}
template <typename T, typename U> T &ctmin(T &x, const U &y) {
  return x = min<T>(x, y);
}
template <typename T>
using Tree =
    tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

int main() {
  cin.tie(0)->sync_with_stdio(0);
  int n;
  cin >> n;
  const int mx = 1e5;
  vector<array<int, 2>> val(n); // value, weight
  for (auto i = 0; i < n; ++i) {
    for (auto j = 0; j < 2; ++j) {
      cin >> val[i][j];
    }
  }
  const int h = 9;
  vector<vector<long long>> dp((1 << h) - 1, vector<long long>(mx + 1));
  // dp[u][x]: max value obtainable for node u with weight at most x
  for (auto x = val[0][1]; x <= mx; ++x) {
    dp[0][x] = val[0][0];
  }
  for (auto u = 1; u < min((1 << h) - 1, n); ++u) {
    int p = u - 1 >> 1;
    dp[u] = dp[p];
    for (auto x = mx; x >= val[u][1]; --x) {
      ctmax(dp[u][x], max(dp[p][x - val[u][1]] + val[u][0], dp[u][x - 1]));
    }
  }
  vector<vector<int>> shift(n, vector<int>(15));
  for (auto u = 1; u < n; ++u) {
    shift[u][0] = u;
    for (auto i = 1; i <= 14; ++i) {
      shift[u][i] = (shift[u][i - 1] - 1) >> 1;
    }
  }
  int qq;
  cin >> qq;
  while (qq--) {
    int u, x;
    cin >> u >> x, --u;
    int ch = __lg(u + 1);
    if (ch < h) {
      cout << dp[u][x] << "\n";
    } else {
      int d = ch - h + 1, p = shift[u][d];
      long long res = 0;
      for (auto mask = 0; mask < 1 << d; ++mask) {
        long long cv = 0, cw = 0;
        for (auto bit = 0; bit < d; ++bit) {
          if (mask & 1 << bit) {
            cv += val[shift[u][bit]][0];
            cw += val[shift[u][bit]][1];
          }
        }
        if (cw <= x) {
          ctmax(res, dp[p][x - cw] + cv);
        }
      }
      cout << res << "\n";
    }
  }
  return 0;
}

/*

*/

////////////////////////////////////////////////////////////////////////////////////////
//                                                                                    //
//                                   Coded by Aeren //
//                                                                                    //
////////////////////////////////////////////////////////////////////////////////////////

Fixed submission:
#include "bits/stdc++.h"
#include "ext/pb_ds/assoc_container.hpp"
#include "ext/pb_ds/tree_policy.hpp"
#include "ext/rope"
using namespace std;
using namespace chrono;
using namespace __gnu_pbds;
using namespace __gnu_cxx;
mt19937 rng(high_resolution_clock::now().time_since_epoch().count());
mt19937_64 rngll(high_resolution_clock::now().time_since_epoch().count());
#define lambdify(x)                                                            \
  [&](auto &&...args) { return x(forward<decltype(args)>(args)...); }
template <typename T, typename U> T &ctmax(T &x, const U &y) {
  return x = max<T>(x, y);
}
template <typename T, typename U> T &ctmin(T &x, const U &y) {
  return x = min<T>(x, y);
}
template <typename T>
using Tree =
    tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

int main() {
  cin.tie(0)->sync_with_stdio(0);
  int n;
  cin >> n;
  const int mx = 1e5;
  vector<array<int, 2>> val(n); // value, weight
  for (auto i = 0; i < n; ++i) {
    for (auto j = 0; j < 2; ++j) {
      cin >> val[i][j];
    }
  }
  const int h = 10;
  vector<vector<long long>> dp((1 << h) - 1, vector<long long>(mx + 1));
  // dp[u][x]: max value obtainable for node u with weight at most x
  for (auto x = val[0][1]; x <= mx; ++x) {
    dp[0][x] = val[0][0];
  }
  for (auto u = 1; u < min((1 << h) - 1, n); ++u) {
    int p = u - 1 >> 1;
    dp[u] = dp[p];
    for (auto x = mx; x >= val[u][1]; --x) {
      ctmax(dp[u][x], max(dp[p][x - val[u][1]] + val[u][0], dp[u][x - 1]));
    }
  }
  vector<vector<int>> shift(n, vector<int>(15));
  for (auto u = 1; u < n; ++u) {
    shift[u][0] = u;
    for (auto i = 1; i <= 14; ++i) {
      shift[u][i] = (shift[u][i - 1] - 1) >> 1;
    }
  }
  int qq;
  cin >> qq;
  while (qq--) {
    int u, x;
    cin >> u >> x, --u;
    int ch = __lg(u + 1);
    if (ch < h) {
      cout << dp[u][x] << "\n";
    } else {
      int d = ch - h + 1, p = shift[u][d];
      long long res = 0;
      for (auto mask = 0; mask < 1 << d; ++mask) {
        long long cv = 0, cw = 0;
        for (auto bit = 0; bit < d; ++bit) {
          if (mask & 1 << bit) {
            cv += val[shift[u][bit]][0];
            cw += val[shift[u][bit]][1];
          }
        }
        if (cw <= x) {
          ctmax(res, dp[p][x - cw] + cv);
        }
      }
      cout << res << "\n";
    }
  }
  return 0;
}

/*

*/

////////////////////////////////////////////////////////////////////////////////////////
//                                                                                    //
//                                   Coded by Aeren //
//                                                                                    //
////////////////////////////////////////////////////////////////////////////////////////