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

// Utkarsh.25dec
#include <bits/stdc++.h>
#include <chrono>
#include <random>
#define ll int
#define ull unsigned long long int
#define pb push_back
#define mp make_pair
#define mod 1000000007
#define rep(i, n) for (ll i = 0; i < n; i++)
#define loop(i, a, b) for (ll i = a; i <= b; i++)
#define vi vector<int>
#define vs vector<string>
#define vc vector<char>
#define vl vector<ll>
#define all(c) (c).begin(), (c).end()
#define max3(a, b, c) max(max(a, b), c)
#define min3(a, b, c) min(min(a, b), c)
#define deb(x) cerr << #x << ' ' << '=' << ' ' << x << '\\n'
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
#define ordered_set                                                            \\
  tree<int, null_type, less<int>, rb_tree_tag,                                 \\
       tree_order_statistics_node_update>
// ordered_set s ; s.order_of_key(val)  no. of elements strictly less than val
// s.find_by_order(i)  itertor to ith element (0 indexed)
typedef vector<vector<ll>> matrix;
ll power(ll a, ll b) {
  ll res = 1;
  a %= mod;
  assert(b >= 0);
  for (; b; b >>= 1) {
    if (b & 1)
      res = res * a % mod;
    a = a * a % mod;
  }
  return res;
}
ll modInverse(ll a) { return power(a, mod - 2); }
const int N = 500023;
int dp[1024][100005];
void solve() {
  ll n;
  cin >> n;
  ll wt[n + 1];
  ll val[n + 1];
  for (int i = 1; i <= n; i++)
    cin >> val[i] >> wt[i];
  ll q;
  cin >> q;
  for (int i = 1; i < min(n + 1, 1024); i++) {
    if (i == 1) {
      for (int j = wt[i]; j <= 100000; j++)
        dp[i][j] = val[i];
      continue;
    }
    int par = i / 2;
    for (int j = 1; j <= 100000; j++) {
      if (wt[i] > j)
        dp[i][j] = dp[par][j];
      else
        dp[i][j] = max(dp[par][j], dp[par][j - wt[i]] + val[i]);
    }
  }
  while (q--) {
    int v, W;
    cin >> v >> W;
    if (v < 1024) {
      cout << dp[v][W] << '\\n';
      continue;
    }
    vi anc;
    while (v >= 1024) {
      anc.pb(v);
      v /= 2;
    }
    int res = anc.size();
    int ans = 0;
    for (int i = 0; i < (1 << res); i++) {
      int sumval = 0, sumwt = 0;
      for (int j = 0; j < res; j++) {
        if ((i & (1 << j)) != 0) {
          sumval += val[anc[j]];
          sumwt += wt[anc[j]];
        }
      }
      if (sumwt > W)
        continue;
      ans = max(ans, sumval + dp[v][W - sumwt]);
    }
    cout << ans << '\\n';
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int T = 1;
  // cin>>T;
  int t = 0;
  while (t++ < T) {
    // cout<<"Case #"<<t<<":"<<' ';
    solve();
    // cout<<'\\n';
  }
  cerr << "Time : " << 1000 * ((double)clock()) / (double)CLOCKS_PER_SEC
       << "ms\\n";
}


Error: TLE

Fixed submission:

// Utkarsh.25dec
#include <bits/stdc++.h>
#include <chrono>
#include <random>
#define ll int
#define ull unsigned long long int
#define pb push_back
#define mp make_pair
#define mod 1000000007
#define rep(i, n) for (ll i = 0; i < n; i++)
#define loop(i, a, b) for (ll i = a; i <= b; i++)
#define vi vector<int>
#define vs vector<string>
#define vc vector<char>
#define vl vector<ll>
#define all(c) (c).begin(), (c).end()
#define max3(a, b, c) max(max(a, b), c)
#define min3(a, b, c) min(min(a, b), c)
#define deb(x) cerr << #x << ' ' << '=' << ' ' << x << '\\n'
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
#define ordered_set                                                            \\
  tree<int, null_type, less<int>, rb_tree_tag,                                 \\
       tree_order_statistics_node_update>
// ordered_set s ; s.order_of_key(val)  no. of elements strictly less than val
// s.find_by_order(i)  itertor to ith element (0 indexed)
typedef vector<vector<ll>> matrix;
ll power(ll a, ll b) {
  ll res = 1;
  a %= mod;
  assert(b >= 0);
  for (; b; b >>= 1) {
    if (b & 1)
      res = res * a % mod;
    a = a * a % mod;
  }
  return res;
}
ll modInverse(ll a) { return power(a, mod - 2); }
const int N = 500023;
int dp[32][100005];
void solve() {
  ll n;
  cin >> n;
  ll wt[n + 1];
  ll val[n + 1];
  for (int i = 1; i <= n; i++)
    cin >> val[i] >> wt[i];
  ll q;
  cin >> q;
  for (int i = 1; i < min(n + 1, 32); i++) {
    if (i == 1) {
      for (int j = wt[i]; j <= 100000; j++)
        dp[i][j] = val[i];
      continue;
    }
    int par = i / 2;
    for (int j = 1; j <= 100000; j++) {
      if (wt[i] > j)
        dp[i][j] = dp[par][j];
      else
        dp[i][j] = max(dp[par][j], dp[par][j - wt[i]] + val[i]);
    }
  }
  while (q--) {
    int v, W;
    cin >> v >> W;
    if (v < 32) {
      cout << dp[v][W] << '\\n';
      continue;
    }
    vi anc;
    while (v >= 32) {
      anc.pb(v);
      v /= 2;
    }
    int res = anc.size();
    int ans = 0;
    for (int i = 0; i < (1 << res); i++) {
      int sumval, sumwt = 0;
      for (int j = 0; j < res; j++) {
        if ((i & j) != 0) {
          sumval += val[anc[j]];
          sumwt += wt[anc[j]];
        }
      }
      if (sumwt > W)
        continue;
      ans = max(ans, sumval + dp[v][W - sumwt]);
    }
    cout << ans << '\\n';
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int T = 1;
  // cin>>T;
  int t = 0;
  while (t++ < T) {
    // cout<<"Case #"<<t<<":"<<' ';
    solve();
    // cout<<'\\n';
  }
  cerr << "Time : " << 1000 * ((double)clock()) / (double)CLOCKS_PER_SEC
       << "ms\\n";
}