Problem p02648 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef pair<ll, int> pli;
typedef pair<int, int> pii;
typedef pair<ll, ld> pld;
typedef pair<pii, int> ppiii;
typedef pair<pii, ll> ppiil;
typedef pair<pll, ll> pplll;
typedef pair<pli, int> pplii;
typedef vector<vector<ll>> vvl;
typedef vector<vector<int>> vvi;
typedef vector<vector<pll>> vvpll;
#define rep(i, a, b) for (ll i = (a); i < (b); i++)
#define rrep(i, a, b) for (ll i = (a); i > (b); i--)
#define pb push_back
#define tostr to_string
#define mkp make_pair
const ll INF = 1e18;
const ll MOD = 1e9 + 7;

void print(ld out) { cout << fixed << setprecision(12) << out << '\n'; }
template <typename T> void print(T out) { cout << out << '\n'; }
template <typename T1, typename T2> void print(pair<T1, T2> out) {
  cout << out.first << ' ' << out.second << '\n';
}
template <typename T> void print(vector<T> A) {
  rep(i, 0, A.size()) {
    cout << A[i];
    cout << (i == A.size() - 1 ? '\n' : ' ');
  }
}
template <typename T> void print(set<T> S) {
  vector<T> A(S.begin(), S.end());
  print(A);
}

template <typename T> inline bool chmax(T &x, T y) {
  return (y > x) ? x = y, true : false;
}
template <typename T> inline bool chmin(T &x, T y) {
  return (y < x) ? x = y, true : false;
}

ll sum(vector<ll> A) {
  ll res = 0;
  for (ll a : A)
    res += a;
  return res;
}
ll max(vector<ll> A) {
  ll res = -INF;
  for (ll a : A)
    chmax(res, a);
  return res;
}
ll min(vector<ll> A) {
  ll res = INF;
  for (ll a : A)
    chmin(res, a);
  return res;
}

ll toint(string s) {
  ll res = 0;
  for (char c : s) {
    res *= 10;
    res += (c - '0');
  }
  return res;
}
int toint(char c) { return c - '0'; }
char tochar(int i) { return '0' + i; }

inline ll pow(int x, ll n) {
  ll res = 1;
  rep(_, 0, n) res *= x;
  return res;
}
inline ll pow(ll x, ll n, int mod) {
  ll res = 1;
  while (n > 0) {
    if (n & 1) {
      res = (res * x) % mod;
    }
    x = (x * x) % mod;
    n >>= 1;
  }
  return res;
}

inline ll floor(ll a, ll b) {
  if (a < 0) {
    return (a - b + 1) / b;
  } else {
    return a / b;
  }
}
inline ll ceil(ll a, ll b) {
  if (a >= 0) {
    return (a + b - 1) / b;
  } else {
    return a / b;
  }
}

int popcount(ll S) { return __builtin_popcountll(S); }
ll gcd(ll a, ll b) { return __gcd(a, b); }

ll N, Q;
const ll M = 1 << 9;
const ll MAXW = 100000;
vector<int> V, W, par;
vvl nodes;
int dp[M + 1][MAXW + 1];

void dfs(ll u, ll prev, ll depth) {
  if (depth == M)
    return;
  rep(w, 0, MAXW + 1) {
    chmax(dp[u + 1][w], dp[prev + 1][w]);
    if (w + W[u] <= MAXW) {
      chmax(dp[u + 1][w + W[u]], dp[prev + 1][w] + V[u]);
    }
  }
  for (ll v : nodes[u]) {
    if (prev == v)
      continue;
    dfs(v, u, depth + 1);
  }
  return;
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  cin >> N;
  V.resize(N);
  W.resize(N);
  par.resize(N);
  nodes.resize(N);
  rep(i, 0, N) cin >> V[i] >> W[i];

  ll v;
  par[0] = -1;
  rep(u, 2, N + 1) {
    v = u / 2;
    nodes[u - 1].pb(v - 1);
    nodes[v - 1].pb(u - 1);
    par[u - 1] = v - 1;
  }
  dfs(0, -1, 0);

  cin >> Q;
  ll x, L, cur, ans, bitln, w;
  vector<int> li;
  rep(_, 0, Q) {
    cin >> x >> L;
    x--;

    li.clear();
    cur = x;
    while (cur != -1) {
      li.pb(cur);
      cur = par[cur];
    }
    if (li.size() <= 9) {
      ans = dp[x + 1][L];
      print(ans);
    } else {
      ans = 0;
      bitln = li.size() - 9;
      rep(bit, 0, 1 << bitln) {
        v = w = 0;
        rep(i, 0, bitln) {
          if (bit >> i & 1) {
            v += V[li[i]];
            w += W[li[i]];
          }
        }
        if (w > L)
          continue;
        chmax(ans, v + dp[li[bitln] + 1][L - w]);
      }
      print(ans);
    }
  }
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef pair<ll, int> pli;
typedef pair<int, int> pii;
typedef pair<ll, ld> pld;
typedef pair<pii, int> ppiii;
typedef pair<pii, ll> ppiil;
typedef pair<pll, ll> pplll;
typedef pair<pli, int> pplii;
typedef vector<vector<ll>> vvl;
typedef vector<vector<int>> vvi;
typedef vector<vector<pll>> vvpll;
#define rep(i, a, b) for (ll i = (a); i < (b); i++)
#define rrep(i, a, b) for (ll i = (a); i > (b); i--)
#define pb push_back
#define tostr to_string
#define mkp make_pair
const ll INF = 1e18;
const ll MOD = 1e9 + 7;

void print(ld out) { cout << fixed << setprecision(12) << out << '\n'; }
template <typename T> void print(T out) { cout << out << '\n'; }
template <typename T1, typename T2> void print(pair<T1, T2> out) {
  cout << out.first << ' ' << out.second << '\n';
}
template <typename T> void print(vector<T> A) {
  rep(i, 0, A.size()) {
    cout << A[i];
    cout << (i == A.size() - 1 ? '\n' : ' ');
  }
}
template <typename T> void print(set<T> S) {
  vector<T> A(S.begin(), S.end());
  print(A);
}

template <typename T> inline bool chmax(T &x, T y) {
  return (y > x) ? x = y, true : false;
}
template <typename T> inline bool chmin(T &x, T y) {
  return (y < x) ? x = y, true : false;
}

ll sum(vector<ll> A) {
  ll res = 0;
  for (ll a : A)
    res += a;
  return res;
}
ll max(vector<ll> A) {
  ll res = -INF;
  for (ll a : A)
    chmax(res, a);
  return res;
}
ll min(vector<ll> A) {
  ll res = INF;
  for (ll a : A)
    chmin(res, a);
  return res;
}

ll toint(string s) {
  ll res = 0;
  for (char c : s) {
    res *= 10;
    res += (c - '0');
  }
  return res;
}
int toint(char c) { return c - '0'; }
char tochar(int i) { return '0' + i; }

inline ll pow(int x, ll n) {
  ll res = 1;
  rep(_, 0, n) res *= x;
  return res;
}
inline ll pow(ll x, ll n, int mod) {
  ll res = 1;
  while (n > 0) {
    if (n & 1) {
      res = (res * x) % mod;
    }
    x = (x * x) % mod;
    n >>= 1;
  }
  return res;
}

inline ll floor(ll a, ll b) {
  if (a < 0) {
    return (a - b + 1) / b;
  } else {
    return a / b;
  }
}
inline ll ceil(ll a, ll b) {
  if (a >= 0) {
    return (a + b - 1) / b;
  } else {
    return a / b;
  }
}

int popcount(ll S) { return __builtin_popcountll(S); }
ll gcd(ll a, ll b) { return __gcd(a, b); }

ll N, Q;
const ll M = 1 << 9;
const ll MAXW = 100000;
vector<int> V, W, par;
vvl nodes;
int dp[M + 1][MAXW + 1];

void dfs(ll u, ll prev, ll depth) {
  if (depth == 9)
    return;
  rep(w, 0, MAXW + 1) {
    chmax(dp[u + 1][w], dp[prev + 1][w]);
    if (w + W[u] <= MAXW) {
      chmax(dp[u + 1][w + W[u]], dp[prev + 1][w] + V[u]);
    }
  }
  for (ll v : nodes[u]) {
    if (prev == v)
      continue;
    dfs(v, u, depth + 1);
  }
  return;
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  cin >> N;
  V.resize(N);
  W.resize(N);
  par.resize(N);
  nodes.resize(N);
  rep(i, 0, N) cin >> V[i] >> W[i];

  ll v;
  par[0] = -1;
  rep(u, 2, N + 1) {
    v = u / 2;
    nodes[u - 1].pb(v - 1);
    nodes[v - 1].pb(u - 1);
    par[u - 1] = v - 1;
  }
  dfs(0, -1, 0);

  cin >> Q;
  ll x, L, cur, ans, bitln, w;
  vector<int> li;
  rep(_, 0, Q) {
    cin >> x >> L;
    x--;

    li.clear();
    cur = x;
    while (cur != -1) {
      li.pb(cur);
      cur = par[cur];
    }
    if (li.size() <= 9) {
      ans = dp[x + 1][L];
      print(ans);
    } else {
      ans = 0;
      bitln = li.size() - 9;
      rep(bit, 0, 1 << bitln) {
        v = w = 0;
        rep(i, 0, bitln) {
          if (bit >> i & 1) {
            v += V[li[i]];
            w += W[li[i]];
          }
        }
        if (w > L)
          continue;
        chmax(ans, v + dp[li[bitln] + 1][L - w]);
      }
      print(ans);
    }
  }
  return 0;
}