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

#include <algorithm>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <string>
#include <utility>
#include <vector>

using namespace std;

#define int long long
#define endl "\\n"

constexpr long long INF = (long long)1e15;
constexpr long long MOD = 1'000'000'007;

struct fast_io {
  fast_io() {
    std::cin.tie(nullptr);
    std::ios::sync_with_stdio(false);
  };
} fio;

vector<int> V, W;
vector<int> v(20), w(20);
vector<vector<pair<int, int>>> HOGE;

const int NUM = 10;

int solve(int nV, int L) {
  int ans = 0;
  int N = 0, tv = nV;
  bool flag = false;
  int ind = 0;

  while (tv) {
    if (HOGE[tv].size()) {
      flag = true;
      ind = tv;
    }
    tv /= 2;
    N++;
  }

  if (flag == true) { // cout<<"<><>"<<" ind = "<<ind<<" N = "<<N<<"
                      // "<<HOGE[ind].size()<<endl;
    int n = NUM + 1;
    int m = N - n;
    // cout<<"n = "<<n<<" m = "<<m<<endl;
    vector<pair<int, int>> fuga(1 << m);

    // for(int i = ind+1; i < N; i++){
    // w[i] = W[nV-1];
    // v[i] = V[nV-1];
    // nV /= 2;
    // }
    for (int i = 0; i < m; i++) { // cout<<"i = "<<i<<" nv = "<<nV<<endl;
      w[i] = W[nV - 1];
      v[i] = V[nV - 1];
      // cout<<v[i]<<" "<<w[i]<<endl;
      nV /= 2;
    }

    for (int i = 0; i < 1 << m; i++) {
      for (int j = 0; j < m; j++) {
        if (1 & (i >> j)) {
          fuga[i].first += w[j];
          fuga[i].second += v[j];
        }
      }
    }

    sort(fuga.begin(), fuga.end());

    for (int i = 0; i < 1 << m; i++) {
      if (i != (1 << m) - 1) {
        fuga[i + 1].second = max(fuga[i].second, fuga[i + 1].second);
      }
      // cout<<i<<" fuga "<<fuga[i].first<<" "<<fuga[i].second<<endl;
    }

    for (int i = 0; i < 1 << m; i++) {
      pair<int, int> p = {L - fuga[i].first, INF};
      int x = lower_bound(HOGE[ind].begin(), HOGE[ind].end(), p) -
              HOGE[ind].begin() - 1;
      if (p.first >= 0) {
        ans = max(HOGE[ind][x].second + fuga[i].second, ans);
      }
    }
  } else {

    int n = N / 2, m = N - n;
    vector<pair<int, int>> hoge(1 << n), fuga(1 << m);

    // cout<<"N = "<<N<<" n = "<<n<<" m = "<<m<<endl;

    for (int i = 0; i < N; i++) {
      w[i] = W[nV - 1];
      v[i] = V[nV - 1];
      nV /= 2;
      // cout<<V[nV-1]<<" "<<W[nV-1]<<endl;
    }

    for (int i = 0; i < 1 << n; i++) {
      for (int j = 0; j < n; j++) {
        if (1 & (i >> j)) {
          hoge[i].first += w[j];
          hoge[i].second += v[j];
        }
      }
    }

    sort(hoge.begin(), hoge.end());

    for (int i = 0; i < 1 << n; i++) {
      if (i != (1 << n) - 1) {
        hoge[i + 1].second = max(hoge[i].second, hoge[i + 1].second);
      }
    }

    for (int i = 0; i < 1 << m; i++) {
      for (int j = 0; j < m; j++) {
        if (1 & (i >> j)) {
          fuga[i].first += w[j + n];
          fuga[i].second += v[j + n];
        }
      }
    }

    sort(fuga.begin(), fuga.end());

    for (int i = 0; i < 1 << m; i++) {
      if (i != (1 << m) - 1) {
        fuga[i + 1].second = max(fuga[i].second, fuga[i + 1].second);
      }
    }

    for (int i = 0; i < 1 << m; i++) {
      pair<int, int> p = {L - fuga[i].first, INF};
      int x = lower_bound(hoge.begin(), hoge.end(), p) - hoge.begin() - 1;
      if (p.first >= 0)
        ans = max(hoge[x].second + fuga[i].second, ans);
    }
  }
  return ans;
}

vector<int> tV, tW;

void rec(int cur, int N,
         int depth) { // cout<<"depth = "<<depth<<" "<<tV.size()<<endl;

  if (cur > N)
    return;

  tV.push_back(V[cur - 1]);
  tW.push_back(W[cur - 1]);

  if (depth == NUM) {

    // for(int i = 0; i < tV.size(); i++){
    // cout<<tV[i]<<" ";

    // }
    // cout<<endl;

    int n = depth + 1;
    // int n = tV.size();

    HOGE[cur].resize(1 << n);

    for (int i = 0; i < 1 << n; i++) {
      for (int j = 0; j < n; j++) {
        if (1 & (i >> j)) {
          HOGE[cur][i].first += tW[j];
          HOGE[cur][i].second += tV[j];
        }
      }
    }

    sort(HOGE[cur].begin(), HOGE[cur].end());

    for (int i = 0; i < 1 << n; i++) {
      if (i != (1 << n) - 1) {
        HOGE[cur][i + 1].second =
            max(HOGE[cur][i].second, HOGE[cur][i + 1].second);
      }
    }

    // for(int i = 0; i < HOGE[cur].size(); i++){
    // cout<<HOGE[cur][i].first<<" ";
    // }
    // cout<<endl;

    tV.pop_back();
    tW.pop_back();

    return;
  }

  rec(cur * 2, N, depth + 1);

  rec(cur * 2 + 1, N, depth + 1);

  tV.pop_back();
  tW.pop_back();
}

signed main() {
  cout << fixed << setprecision(10);

  int N;
  int Q;

  cin >> N;

  V.resize(N);
  W.resize(N);
  HOGE.resize(1 << 12);

  for (int i = 0; i < N; i++) {
    cin >> V[i] >> W[i];
  }

  rec(1, N, 0);

  cin >> Q;

  for (int i = 0; i < Q; i++) { // cout<<"i = "<<i<<endl;
    int v, L;

    cin >> v >> L;

    cout << solve(v, L) << endl;
  }

  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <string>
#include <utility>
#include <vector>

using namespace std;

#define int long long
#define endl "\\n"

constexpr long long INF = (long long)1e15;
constexpr long long MOD = 1'000'000'007;

struct fast_io {
  fast_io() {
    std::cin.tie(nullptr);
    std::ios::sync_with_stdio(false);
  };
} fio;

vector<int> V, W;
vector<int> v(20), w(20);

int solve(int nV, int L) {
  int ans = 0;
  int N = 0, tv = nV;

  while (tv) {
    tv /= 2;
    N++;
  }

  int n = N / 2, m = N - n;
  vector<pair<int, int>> hoge(1 << n), fuga(1 << m);

  // cout<<"N = "<<N<<" n = "<<n<<" m = "<<m<<endl;

  for (int i = 0; i < N; i++) {
    w[i] = W[nV - 1];
    v[i] = V[nV - 1];
    nV /= 2;
    // cout<<V[nV-1]<<" "<<W[nV-1]<<endl;
  }

  for (int i = 0; i < 1 << n; i++) {
    for (int j = 0; j < n; j++) {
      if (1 & (i >> j)) {
        hoge[i].first += w[j];
        hoge[i].second += v[j];

        nV /= 2;
      }
    }
  }

  sort(hoge.begin(), hoge.end());

  for (int i = 0; i < 1 << n; i++) {
    if (i != (1 << n) - 1) {
      hoge[i + 1].second = max(hoge[i].second, hoge[i + 1].second);
    }
  }

  for (int i = 0; i < 1 << m; i++) {
    for (int j = 0; j < m; j++) {
      if (1 & (i >> j)) {
        fuga[i].first += w[j + n];
        fuga[i].second += v[j + n];
        nV /= 2;
      }
    }
  }

  sort(fuga.begin(), fuga.end());

  for (int i = 0; i < 1 << m; i++) {
    if (i != (1 << m) - 1) {
      fuga[i + 1].second = max(fuga[i].second, fuga[i + 1].second);
    }
  }

  for (int i = 0; i < 1 << m; i++) {
    pair<int, int> p = {L - fuga[i].first, INF};
    int x = lower_bound(hoge.begin(), hoge.end(), p) - hoge.begin() - 1;
    if (p.first >= 0)
      ans = max(hoge[x].second + fuga[i].second, ans);
  }

  return ans;
}

signed main() {
  cout << fixed << setprecision(10);

  int N;
  int Q;

  cin >> N;

  V.resize(N);
  W.resize(N);

  for (int i = 0; i < N; i++) {
    cin >> V[i] >> W[i];
  }

  cin >> Q;

  for (int i = 0; i < Q; i++) { // cout<<"i = "<<i<<endl;
    int v, L;

    cin >> v >> L;

    cout << solve(v, L) << endl;
  }

  return 0;
}