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

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <vector>

using namespace std;
typedef long long ll;
int N;
int Q;
ll W[(1 << 18) + 1], V[(1 << 18) + 1];
ll dp[(1 << 9) + 1][100001];
ll dp_prev[100001];
ll dp_cur[100001];

int D;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout << setprecision(10) << fixed;
  cin >> N;
  for (int i = 0; i < 20; i++) {
    if ((1 << i) > N) {
      D = i;
      break;
    }
  }
  int M = D / 2;
  int th = (1 << M);
  for (int i = 1; i <= N; i++)
    cin >> V[i] >> W[i];
  cin >> Q;
  for (int i = 1; i < (1 << M); i++) {
    if (i == 1) {
      dp[i][W[i]] = V[i];
      for (int j = 1; j <= 100000; j++) {
        dp[i][j] = max(dp[i][j - 1], dp[i][j]);
      }
    } else {
      int par = i / 2;
      for (int j = 0; j <= 100000; j++) {
        dp[i][j] = max(dp[i][j], dp[par][j]);
      }
      for (int j = 0; j + W[i] <= 100000; j++) {
        dp[i][j + W[i]] = max(dp[par][j] + V[i], dp[i][j + W[i]]);
      }
      for (int j = 1; j <= 100000; j++) {
        dp[i][j] = max(dp[i][j - 1], dp[i][j]);
      }
    }
    // for(int i = 0; i <= 100000; i++){
    //     dp_cur[i] = 0; dp_prev[i] = 0;
    // }
    // int cur = i;
    // while(true){
    //     for(int j = 0; j+W[cur] <= 100000; j++){
    //         dp_cur[j+W[cur]] = max(dp_cur[j+W[cur]], dp_prev[j]+V[cur]);
    //     }
    //     for(int j = 0; j <= 100000; j++) dp_prev[j] = dp_cur[j];
    //     cur = cur/2;
    //     if(cur == 0) break;
    // }
    // for(int j = 1; j <= 100000; j++) {
    //     dp[i][j] = max(dp[i][j-1], dp_cur[j]);
    // }
  }
  for (int i = 0; i < Q; i++) {
    int v, L;
    cin >> v >> L;
    if (v < th) {
      cout << dp[v][L] << endl;
      continue;
    }
    int cur = v;
    vector<int> vv, vw;
    while (true) {
      vv.push_back(V[cur]);
      vw.push_back(W[cur]);
      cur = cur / 2;
      if (cur < th)
        break;
    }
    int sz = vv.size();
    // cout << i << " cur:" << cur << ' ' << sz << endl;
    int ans = 0;
    for (int j = 0; j < (1 << sz); j++) {
      int sumv = 0, sumw = 0;
      for (int k = 0; k < sz; k++) {
        if (j & (1 << k)) {
          sumv += vv[k];
          sumw += vw[k];
          // cout  << vv[k] << '-' << vw[k] << ' ';
        }
      }
      if (sumw > L)
        continue;
      int tmp = sumv + dp[cur][L - sumw];
      ans = max(ans, tmp);
      // cout << sumv << ' ' << sumw << ' ' << tmp << ' ' << ans<< ' ' <<
      // dp[cur][L-sumw] << ' ' << L-sumw << endl;
    }
    cout << ans << endl;
  }
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <vector>

using namespace std;
typedef long long ll;
int N;
int Q;
ll W[(1 << 18) + 1], V[(1 << 18) + 1];
ll dp[(1 << 9) + 1][100001];
ll dp_prev[100001];
ll dp_cur[100001];

int D;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout << setprecision(10) << fixed;
  cin >> N;
  for (int i = 0; i < 20; i++) {
    if ((1 << i) > N) {
      D = i;
      break;
    }
  }
  int M = D / 2;
  int th = (1 << M);
  for (int i = 1; i <= N; i++)
    cin >> V[i] >> W[i];
  cin >> Q;
  for (int i = 1; i < (1 << M); i++) {
    // if(i == 1){
    //     dp[i][W[i]] = V[i];
    // }else{
    //     int par = i/2;
    //     for(int j = 0; j <= 100000; j++) {
    //         dp[i][j] = dp[par][j];
    //     }
    //     for(int j = 0; j+W[i] <= 100000; j++) {
    //         dp[i][j+W[i]] = max(dp[par][j]+V[i], dp[i][j+W[i]]);
    //     }
    //     for(int j = 1; j <= 100000; j++) {
    //         dp[i][j] = max(dp[i][j-1], dp[i][j]);
    //     }
    // }
    for (int i = 0; i <= 100000; i++) {
      dp_cur[i] = 0;
      dp_prev[i] = 0;
    }
    int cur = i;
    while (true) {
      for (int j = 0; j + W[cur] <= 100000; j++) {
        dp_cur[j + W[cur]] = max(dp_cur[j + W[cur]], dp_prev[j] + V[cur]);
      }
      for (int j = 0; j <= 100000; j++)
        dp_prev[j] = dp_cur[j];
      cur = cur / 2;
      if (cur == 0)
        break;
    }
    for (int j = 1; j <= 100000; j++) {
      dp[i][j] = max(dp[i][j - 1], dp_cur[j]);
    }
  }
  for (int i = 0; i < Q; i++) {
    int v, L;
    cin >> v >> L;
    if (v < th) {
      cout << dp[v][L] << endl;
      continue;
    }
    int cur = v;
    vector<int> vv, vw;
    while (true) {
      vv.push_back(V[cur]);
      vw.push_back(W[cur]);
      cur = cur / 2;
      if (cur < th)
        break;
    }
    int sz = vv.size();
    // cout << i << " cur:" << cur << ' ' << sz << endl;
    int ans = 0;
    for (int j = 0; j < (1 << sz); j++) {
      int sumv = 0, sumw = 0;
      for (int k = 0; k < sz; k++) {
        if (j & (1 << k)) {
          sumv += vv[k];
          sumw += vw[k];
          // cout  << vv[k] << '-' << vw[k] << ' ';
        }
      }
      if (sumw > L)
        continue;
      int tmp = sumv + dp[cur][L - sumw];
      ans = max(ans, tmp);
      // cout << sumv << ' ' << sumw << ' ' << tmp << ' ' << ans<< ' ' <<
      // dp[cur][L-sumw] << ' ' << L-sumw << endl;
    }
    cout << ans << endl;
  }
}