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

#include <bits/stdc++.h>
using namespace std;
// #include "testlib.h"
#pragma GCC optimize("Ofast")
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target(                                                            \\
    "sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
#define ff first
#define ss second
#define all(v) v.begin(), v.end()

#define ll int
#define M 1000000007
#define MM 998244353
#define inputarr(a, n)                                                         \\
  for (int i = 0; i < n; ++i)                                                  \\
  cin >> a[i]
#define GCD(m, n) __gcd(m, n)
#define LCM(m, n) m *(n / GCD(m, n))
#define mii map<ll, ll>
#define msi map<string, ll>
#define rep(a, b) for (ll i = a; i < b; i++)
#define rep0(n) for (ll i = 0; i < n; i++)
#define repi(i, a, b) for (ll i = a; i < b; i++)
#define pb push_back
#define vi vector<ll>
#define vs vector<string>
#define ppb pop_back
#define endl '\\n'
#define asdf                                                                   \\
  ios_base::sync_with_stdio(false);                                            \\
  cin.tie(0);                                                                  \\
  cout.tie(0);
#define r0 return 0;
#define FORD(i, a, b) for (int i = (int)(a); i >= (int)(b); --i)
#define inputoutput                                                            \\
  freopen("input.txt", "r", stdin);                                            \\
  freopen("output.txt", "w", stdout);
#define Set(a, s) (a, s, sizeof(a))
#define FOR repi
#define vii vector<pii>
#define pii pair<int, int>
#define REVERSE(v) reverse(all(v))
#define trav(a, x) for (auto &a : x)
#define display(x)                                                             \\
  trav(a, x) cout << a << " ";                                                 \\
  cout << endl
#define debug cerr << "bhau" << endl
#define trace(...) __f(#__VA_ARGS__, __VA_ARGS__)
template <typename Arg1> void __f(const char *name, Arg1 &&arg1) {
  std::cerr << name << " : " << arg1 << endl;
}
template <typename Arg1, typename... Args>
void __f(const char *names, Arg1 &&arg1, Args &&...args) {
  const char *comma = strchr(names + 1, ',');
  std::cerr.write(names, comma - names) << " : " << arg1 << " | ";
  __f(comma + 1, args...);
}
template <typename T, typename U> static inline void amin(T &x, U y) {
  if (y < x)
    x = y;
}
template <typename T, typename U> static inline void amax(T &x, U y) {
  if (x < y)
    x = y;
}

ll max(ll a, ll b) { return (a > b) ? a : b; }
int min(int a, int b) { return (a < b) ? a : b; }

const int N = 1e5 + 1;
const int MAX = 1e5 + 1;
int dp[512][N];

int solve() {

  int n;
  cin >> n;
  // vector<vi> dp(n/2,)
  vi v(n), w(n);
  rep0(n) cin >> v[i] >> w[i];
  int limit = min(512, n);
  // memset(dp,0,sizeof(dp));
  for (int i = w[0]; i < N; i++) {
    dp[0][i] = v[0];
  }
  for (int i = 1; i < limit; i++) {
    int p = (i - 1) / 2;
    for (int j = 1; j < N; j++) {
      dp[i][j] = dp[p][j];
      if (j >= w[i]) {
        dp[i][j] = max(dp[i][j], dp[p][j - w[i]] + v[i]);
      }
    }
  }
  int q;
  cin >> q;
  // q=0;
  while (q--) {
    int ve, l;
    cin >> ve >> l;
    ve--;
    vi ids;
    while (ve >= limit) {
      ids.pb(ve);
      ve = (ve - 1) / 2;
    }
    int sz = ids.size();
    int ans = 0;
    for (int i = 0; i < (1 << sz); i++) {
      int sw = 0, sv = 0;
      for (int j = 0; j < sz; j++) {
        if (i & (1 << j))
          sw += w[ids[j]], sv += v[ids[j]];
      }
      if (sw <= l) {
        amax(ans, dp[ve][l - sw] + sv);
      }
    }
    cout << ans << endl;
  }

  return 0;
}
signed main() {
  asdf int t = 1;
  // cin>>t;
  while (t--) {
    solve();
  }
  return 0;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
// #include "testlib.h"
#define ff first
#define ss second
#define all(v) v.begin(), v.end()
#define int long long
#define ll long long
#define M 1000000007
#define MM 998244353
#define inputarr(a, n)                                                         \\
  for (int i = 0; i < n; ++i)                                                  \\
  cin >> a[i]
#define GCD(m, n) __gcd(m, n)
#define LCM(m, n) m *(n / GCD(m, n))
#define mii map<ll, ll>
#define msi map<string, ll>
#define rep(a, b) for (ll i = a; i < b; i++)
#define rep0(n) for (ll i = 0; i < n; i++)
#define repi(i, a, b) for (ll i = a; i < b; i++)
#define pb push_back
#define vi vector<ll>
#define vs vector<string>
#define ppb pop_back
#define endl '\\n'
#define asdf                                                                   \\
  ios_base::sync_with_stdio(false);                                            \\
  cin.tie(0);                                                                  \\
  cout.tie(0);
#define r0 return 0;
#define FORD(i, a, b) for (int i = (int)(a); i >= (int)(b); --i)
#define inputoutput                                                            \\
  freopen("input.txt", "r", stdin);                                            \\
  freopen("output.txt", "w", stdout);
#define Set(a, s) (a, s, sizeof(a))
#define FOR repi
#define vii vector<pii>
#define pii pair<int, int>
#define REVERSE(v) reverse(all(v))
#define trav(a, x) for (auto &a : x)
#define display(x)                                                             \\
  trav(a, x) cout << a << " ";                                                 \\
  cout << endl
#define debug cerr << "bhau" << endl
#define trace(...) __f(#__VA_ARGS__, __VA_ARGS__)
template <typename Arg1> void __f(const char *name, Arg1 &&arg1) {
  std::cerr << name << " : " << arg1 << endl;
}
template <typename Arg1, typename... Args>
void __f(const char *names, Arg1 &&arg1, Args &&...args) {
  const char *comma = strchr(names + 1, ',');
  std::cerr.write(names, comma - names) << " : " << arg1 << " | ";
  __f(comma + 1, args...);
}
template <typename T, typename U> static inline void amin(T &x, U y) {
  if (y < x)
    x = y;
}
template <typename T, typename U> static inline void amax(T &x, U y) {
  if (x < y)
    x = y;
}

ll max(ll a, ll b) { return (a > b) ? a : b; }
int min(int a, int b) { return (a < b) ? a : b; }

const int N = 1e5 + 1;
const int MAX = 1e5 + 1;
int dp[512][N];

int solve() {

  int n;
  cin >> n;
  // vector<vi> dp(n/2,)
  vi v(n), w(n);
  rep0(n) cin >> v[i] >> w[i];
  int limit = min(512, n);
  // memset(dp,0,sizeof(dp));
  for (int i = w[0]; i < N; i++) {
    dp[0][i] = v[0];
  }
  for (int i = 1; i < limit; i++) {
    int p = (i - 1) / 2;
    for (int j = 1; j < N; j++) {
      dp[i][j] = dp[p][j];
      if (j >= w[i]) {
        dp[i][j] = max(dp[i][j], dp[p][j - w[i]] + v[i]);
      }
    }
  }
  int q;
  cin >> q;
  // q=0;
  while (q--) {
    int ve, l;
    cin >> ve >> l;
    ve--;
    vi ids;
    while (ve >= limit) {
      ids.pb(ve);
      ve = (ve - 1) / 2;
    }
    int sz = ids.size();
    int ans = 0;
    for (int i = 0; i < (1 << sz); i++) {
      int sw = 0, sv = 0;
      for (int j = 0; j < sz; j++) {
        if (i & (1 << j))
          sw += w[ids[j]], sv += v[ids[j]];
      }
      if (sw <= l) {
        amax(ans, dp[ve][l - sw] + sv);
      }
    }
    cout << ans << endl;
  }

  return 0;
}
signed main() {
  asdf int t = 1;
  // cin>>t;
  while (t--) {
    solve();
  }
  return 0;
}