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;
  vector<array<int, 2>> a(n + 1);
  for (auto i = 1; i <= n; ++i) {
    for (auto j = 0; j < 2; ++j) {
      cin >> a[i][j];
    }
  }
  const int h = 3, mx = 1e5;
  vector<vector<long long>> dp(1 << h, vector<long long>(mx + 1));
  for (auto u = 1; u < min(1 << h, n + 1); ++u) {
    int p = u >> 1;
    dp[u] = dp[p];
    for (auto x = a[u][1]; x <= mx; ++x) {
      ctmax(dp[u][x], max(dp[u][x - 1], dp[p][x - a[u][1]] + a[u][0]));
    }
  }
  int qq;
  cin >> qq;
  while (qq--) {
    int u, x;
    cin >> u >> x;
    if (__lg(u) < h) {
      cout << dp[u][x] << "\n";
    } else {
      int d = __lg(u) - h + 1;
      long long res = dp[u >> d][x], sv = 0, sw = 0;
      for (auto mask = 1; mask < 1 << d; ++mask) {
        for (auto bit = 0; bit < d; ++bit) {
          if (mask & 1 << bit) {
            sv += a[u >> bit][0];
            sw += a[u >> bit][1];
            break;
          } else {
            sv -= a[u >> bit][0];
            sw -= a[u >> bit][1];
          }
        }
        if (sw <= x)
          ctmax(res, dp[u >> d][x - sw] + sv);
      }
      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;
  vector<array<int, 2>> a(n + 1);
  for (auto i = 1; i <= n; ++i) {
    for (auto j = 0; j < 2; ++j) {
      cin >> a[i][j];
    }
  }
  const int h = 9, mx = 1e5;
  vector<vector<long long>> dp(1 << h, vector<long long>(mx + 1));
  for (auto u = 1; u < min(1 << h, n + 1); ++u) {
    int p = u >> 1;
    dp[u] = dp[p];
    for (auto x = a[u][1]; x <= mx; ++x) {
      ctmax(dp[u][x], max(dp[u][x - 1], dp[p][x - a[u][1]] + a[u][0]));
    }
  }
  int qq;
  cin >> qq;
  while (qq--) {
    int u, x;
    cin >> u >> x;
    if (__lg(u) < h) {
      cout << dp[u][x] << "\n";
    } else {
      int d = __lg(u) - h + 1;
      long long res = dp[u >> d][x], sv = 0, sw = 0;
      for (auto mask = 1; mask < 1 << d; ++mask) {
        for (auto bit = 0; bit < d; ++bit) {
          if (mask & 1 << bit) {
            sv += a[u >> bit][0];
            sw += a[u >> bit][1];
            break;
          } else {
            sv -= a[u >> bit][0];
            sw -= a[u >> bit][1];
          }
        }
        if (sw <= x)
          ctmax(res, dp[u >> d][x - sw] + sv);
      }
      cout << res << "\n";
    }
  }
  return 0;
}

/*

*/

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