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

/*
ЗАПУСКАЕМ
░ГУСЯ░▄▀▀▀▄░РАБОТЯГУ░░
▄███▀░◐░░░▌░░░░░░░
░░░░▌░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░▄▀▒▒▀▀▀▀▄
░░░▐░░░░▐▒▒▒▒▒▒▒▒▀▀▄
░░░▐░░░░▐▄▒▒▒▒▒▒▒▒▒▒▀▄
░░░░▀▄░░░░▀▄▒▒▒▒▒▒▒▒▒▒▀▄
░░░░░░▀▄▄▄▄▄█▄▄▄▄▄▄▄▄▄▄▄▀▄
░░░░░░░░░░░▌▌░▌▌░░░░░
░░░░░░░░░░░▌▌░▌▌░░░░░
░░░░░░░░░▄▄▌▌▄▌▌░░░░░
*/
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

using namespace std;
template <typename T1, typename T2> inline void chkmin(T1 &a, T2 b) {
  if (a > b)
    a = b;
}
template <typename T1, typename T2> inline void chkmax(T1 &a, T2 b) {
  if (a < b)
    a = b;
}
#define files(FILENAME)                                                        \\
  read(FILENAME);                                                              \\
  write(FILENAME)
#define read(FILENAME) freopen((FILENAME + ".in").c_str(), "r", stdin)
#define write(FILENAME) freopen((FILENAME + ".out").c_str(), "w", stdout)
#define all(c) (c).begin(), (c).end()
#define sz(c) (int)(c).size()
#define left left228
#define right right228
#define y1 y1228
#define mp make_pair
#define pb push_back
#define y2 y2228
#define rank rank228
using ll = long long;
using ld = long double;
const string FILENAME = "input";
const int MAXN = 600228;

int n;
int v[MAXN], w[MAXN];
int q;
int ans[MAXN];
vector<pair<int, int>> z[MAXN];

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  // read(FILENAME);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> v[i] >> w[i];
  }
  cin >> q;
  for (int it = 0; it < q; it++) {
    int vv;
    cin >> vv;
    int maxw;
    cin >> maxw;
    z[vv].pb(mp(maxw, it));
  }
  for (int is = 1; is <= n; is++) {
    if (z[is].empty()) {
      continue;
    }
    int vv = is;
    vector<int> st;
    while (vv) {
      st.pb(vv);
      vv >>= 1;
    }
    if (sz(st) == 1) {
      for (auto x : z[is]) {
        if (w[st[0]] <= x.first) {
          ans[x.second] = v[st[0]];
        }
      }
    } else {
      vector<pair<int, int>> sts, sts1;
      sts.pb(mp(0, 0));
      sts1.pb(mp(0, 0));
      for (int j = 0; j < sz(st) / 2; j++) {
        vector<pair<int, int>> sts2, ys;
        for (auto x : sts) {
          sts2.pb(mp(x.first + w[st[j]], x.second + v[st[j]]));
        }
        ys.resize(sz(sts) + sz(sts2));
        merge(all(sts), all(sts2), ys.begin());
        swap(ys, sts);
      }
      for (int i = 0; i < sz(sts); i++) {
        for (auto x : z[is]) {
          if (sts[i].first <= x.first) {
            chkmax(ans[x.second], sts[i].second);
          }
        }
      }
      for (int i = 1; i < sz(sts); i++) {
        chkmax(sts[i].second, sts[i - 1].second);
      }
      for (int j = 0; j < sz(st) - sz(st) / 2; j++) {
        vector<pair<int, int>> sts2, ys;
        for (auto x : sts1) {
          sts2.pb(mp(x.first + w[st[j + sz(st) / 2]],
                     x.second + v[st[j + sz(st) / 2]]));
        }
        ys.resize(sz(sts1) + sz(sts2));
        // cout << sz(sts1) << endl;
        merge(all(sts1), all(sts2), ys.begin());
        swap(ys, sts1);
      }
      for (auto y : z[is]) {
        int uk = sz(sts) - 1;
        for (auto x : sts1) {
          while (uk >= 0 && sts[uk].first + x.first > y.first) {
            uk--;
          }
          if (uk >= 0) {
            chkmax(ans[y.second], sts[uk].second + x.second);
          } else {
            if (x.first <= y.first) {
              chkmax(ans[y.second], x.second);
            }
          }
        }
      }
    }
  }
  for (int it = 0; it < q; it++) {
    cout << ans[it] << '\\n';
  }
  return 0;
}


Error: TLE

Fixed submission:

/*
ЗАПУСКАЕМ
░ГУСЯ░▄▀▀▀▄░РАБОТЯГУ░░
▄███▀░◐░░░▌░░░░░░░
░░░░▌░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░▄▀▒▒▀▀▀▀▄
░░░▐░░░░▐▒▒▒▒▒▒▒▒▀▀▄
░░░▐░░░░▐▄▒▒▒▒▒▒▒▒▒▒▀▄
░░░░▀▄░░░░▀▄▒▒▒▒▒▒▒▒▒▒▀▄
░░░░░░▀▄▄▄▄▄█▄▄▄▄▄▄▄▄▄▄▄▀▄
░░░░░░░░░░░▌▌░▌▌░░░░░
░░░░░░░░░░░▌▌░▌▌░░░░░
░░░░░░░░░▄▄▌▌▄▌▌░░░░░
*/
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

using namespace std;
template <typename T1, typename T2> inline void chkmin(T1 &a, T2 b) {
  if (a > b)
    a = b;
}
template <typename T1, typename T2> inline void chkmax(T1 &a, T2 b) {
  if (a < b)
    a = b;
}
#define files(FILENAME)                                                        \\
  read(FILENAME);                                                              \\
  write(FILENAME)
#define read(FILENAME) freopen((FILENAME + ".in").c_str(), "r", stdin)
#define write(FILENAME) freopen((FILENAME + ".out").c_str(), "w", stdout)
#define all(c) (c).begin(), (c).end()
#define sz(c) (int)(c).size()
#define left left228
#define right right228
#define y1 y1228
#define mp make_pair
#define pb push_back
#define y2 y2228
#define rank rank228
using ll = long long;
using ld = long double;
const string FILENAME = "input";
const int MAXN = 600228;

int n;
int v[MAXN], w[MAXN];
int q;

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  // read(FILENAME);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> v[i] >> w[i];
  }
  cin >> q;
  for (int it = 0; it < q; it++) {
    int vv;
    cin >> vv;
    int maxw;
    cin >> maxw;
    vector<int> st;
    while (vv) {
      st.pb(vv);
      vv >>= 1;
    }
    if (sz(st) == 1) {
      if (w[st[0]] <= maxw) {
        cout << v[st[0]] << '\\n';
      } else {
        cout << 0 << '\\n';
      }
    } else {
      int ans = 0;
      vector<pair<int, int>> sts;
      for (int i = 1; i < (1 << (sz(st) / 2)); i++) {
        int sumw = 0;
        int sumv = 0;
        for (int j = 0; j < sz(st) / 2; j++) {
          if (i & (1 << j)) {
            sumw += w[st[j]];
            sumv += v[st[j]];
          }
        }
        if (sumw <= maxw) {
          chkmax(ans, sumv);
          //	cout << sumv << endl;
          sts.pb(mp(sumw, sumv));
        }
      }
      sort(all(sts));
      for (int i = 1; i < sz(sts); i++) {
        chkmax(sts[i].second, sts[i - 1].second);
      }
      for (int i = 1; i < (1 << (sz(st) - sz(st) / 2)); i++) {
        int sumw = 0;
        int sumv = 0;
        for (int j = 0; j < sz(st) - sz(st) / 2; j++) {
          if (i & (1 << j)) {
            sumw += w[st[j + sz(st) / 2]];
            sumv += v[st[j + sz(st) / 2]];
          }
        }
        if (sumw <= maxw) {
          chkmax(ans, sumv);
          int pos =
              upper_bound(all(sts), mp(maxw - sumw, (int)1e9)) - sts.begin();
          // cout << sumw << ' ' << "ila" << ' ' << sts[pos - 1].second << endl;
          if (pos) {
            chkmax(ans, sumv + sts[pos - 1].second);
          }
        }
      }
      cout << ans << '\\n';
    }
  }
  return 0;
}