Problem p02648 (C++) — buggy submission, verdict: Runtime Error

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll MOD = (ll)1e9 + 7;
// const ll MOD=(ll)998244353;
const ll INF = (ll)1e18 + 10;
const double PI = 2.0 * acos(0);
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
int dy[] = {-1, 1, 0, 0};
int dx[] = {0, 0, -1, 1};

ll dp[1024][100010];

void solve(int ca) {
  int N;
  cin >> N;
  vector<int> v(N + 1), w(N + 1);
  for (int i = 1; i <= N; ++i) {
    cin >> v[i] >> w[i];
  }

  int Q;
  cin >> Q;
  vector<int> u(Q), L(Q);
  int maxiL = 0;
  for (int i = 0; i < Q; ++i) {
    cin >> u[i] >> L[i];
    chmax(maxiL, L[i]);
  }
  // maxiL=500010;
  // int half = (1<<((int)ceil(log2(N))/2))-1;
  int half = min(1023, N);
  // cout<<half<<endl;
  // vector<vector<ll>> dp(half+1,vector<ll>(maxiL+1,0));

  for (int i = 1; i <= half; ++i) {
    int par = i / 2;
    for (int j = 0; j <= maxiL; ++j) {
      dp[i][j] = dp[par][j];
      if (j - w[i] >= 0)
        chmax(dp[i][j], dp[par][j - w[i]] + v[i]);
    }
  }
  /*
  for(auto i:dp){
      for(auto j:i){
          cout<<j<<" ";
      }
      cout<<endl;
  }
   */

  for (int i = 0; i < Q; ++i) {
    if (u[i] <= half) {
      printf("%lld\\n", dp[u[i]][L[i]]);
    } else {
      vector<int> nodes;
      int n = u[i];
      while (n > half) {
        nodes.push_back(n);
        n >>= 1;
      }
      const int M = nodes.size();
      ll ans = 0;
      for (int j = 0; j < (1 << M); ++j) {
        ll vsum = 0, wsum = 0;
        for (int k = 0; k < M; ++k) {
          if ((j >> k) & 1) {
            vsum += v[nodes[k]];
            wsum += w[nodes[k]];
          }
        }
        if (wsum > L[i])
          continue;
        chmax(ans, dp[n][L[i] - wsum] + vsum);
      }
      cout << ans << endl;
    }
  }
}

// #define MULTI
int main() {
#ifdef MULTI
  int N;
  cin >> N;
  for (int i = 0; i < N; ++i) {
    solve(i + 1);
  }
#else
  solve(0);
#endif
  return 0;
}


Error: -11

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll MOD = (ll)1e9 + 7;
// const ll MOD=(ll)998244353;
const ll INF = (ll)1e18 + 10;
const double PI = 2.0 * acos(0);
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
int dy[] = {-1, 1, 0, 0};
int dx[] = {0, 0, -1, 1};

int dp[1024][100010];

void solve(int ca) {
  int N;
  cin >> N;
  vector<int> v(N + 1), w(N + 1);
  for (int i = 1; i <= N; ++i) {
    cin >> v[i] >> w[i];
  }

  int Q;
  cin >> Q;
  vector<int> u(N), L(N);
  int maxiL = 0;
  for (int i = 0; i < Q; ++i) {
    cin >> u[i] >> L[i];
    chmax(maxiL, L[i]);
  }
  // maxiL=500010;
  // int half = (1<<((int)ceil(log2(N))/2))-1;
  int half = min(1023, N);
  // cout<<half<<endl;
  // vector<vector<ll>> dp(half+1,vector<ll>(maxiL+1,0));

  for (int i = 1; i <= half; ++i) {
    int par = i / 2;
    for (int j = 0; j <= maxiL; ++j) {
      dp[i][j] = dp[par][j];
      if (j - w[i] >= 0)
        chmax(dp[i][j], dp[par][j - w[i]] + v[i]);
    }
  }
  /*
  for(auto i:dp){
      for(auto j:i){
          cout<<j<<" ";
      }
      cout<<endl;
  }
   */

  for (int i = 0; i < Q; ++i) {
    if (u[i] <= half) {
      printf("%lld\\n", dp[u[i]][L[i]]);
    } else {
      vector<int> nodes;
      int n = u[i];
      while (n > half) {
        nodes.push_back(n);
        n >>= 1;
      }
      const int M = nodes.size();
      ll ans = 0;
      for (int j = 0; j < (1 << M); ++j) {
        ll vsum = 0, wsum = 0;
        for (int k = 0; k < M; ++k) {
          if ((j >> k) & 1) {
            vsum += v[nodes[k]];
            wsum += w[nodes[k]];
          }
        }
        // cout<<"called"<<endl;
        if (wsum > L[i])
          continue;
        chmax(ans, dp[n][L[i] - wsum] + vsum);
      }
      cout << ans << endl;
    }
  }
}

// #define MULTI
int main() {
#ifdef MULTI
  int N;
  cin >> N;
  for (int i = 0; i < N; ++i) {
    solve(i + 1);
  }
#else
  solve(0);
#endif
  return 0;
}