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

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define REP(i, n) FOR(i, 0, n)
#define ALL(x) (x).begin(), (x).end()
const long long MOD = 1e9 + 7;
// const long long MOD=998244353;
const int INF = 1e9;
const long long IINF = 1e18;
const int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
const char dir[4] = {'D', 'R', 'U', 'L'};
#define LOCAL

template <typename T> istream &operator>>(istream &is, vector<T> &v) {
  for (T &x : v)
    is >> x;
  return is;
}
template <typename T> ostream &operator<<(ostream &os, const vector<T> &v) {
  for (int i = 0; i < v.size(); ++i) {
    os << v[i] << (i + 1 == v.size() ? "" : " ");
  }
  return os;
}
template <typename T, typename U>
ostream &operator<<(ostream &os, const pair<T, U> &p) {
  cout << '(' << p.first << ',' << p.second << ')';
  return os;
}
template <typename T, typename U>
ostream &operator<<(ostream &os, const map<T, U> &m) {
  os << '{';
  for (auto itr = m.begin(); itr != m.end(); ++itr) {
    os << '(' << itr->first << ',' << itr->second << ')';
    if (++itr != m.end())
      os << ',';
    --itr;
  }
  os << '}';
  return os;
}
template <typename T> ostream &operator<<(ostream &os, const set<T> &s) {
  os << '{';
  for (auto itr = s.begin(); itr != s.end(); ++itr) {
    os << *itr;
    if (++itr != s.end())
      os << ',';
    --itr;
  }
  os << '}';
  return os;
}

void debug_out() { cerr << '\\n'; }
template <class Head, class... Tail>
void debug_out(Head &&head, Tail &&...tail) {
  cerr << head;
  if (sizeof...(Tail) > 0)
    cerr << ", ";
  debug_out(move(tail)...);
}
#ifdef LOCAL
#define debug(...)                                                             \\
  cerr << " ";                                                                 \\
  cerr << #__VA_ARGS__ << " :[" << __LINE__ << ":" << __FUNCTION__ << "]"      \\
       << '\\n';                                                                \\
  cerr << " ";                                                                 \\
  debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif

template <typename T> T gcd(T x, T y) { return y != 0 ? gcd(y, x % y) : x; }
template <typename T> T lcm(T x, T y) { return x / gcd(x, y) * y; }

template <class T1, class T2> inline bool chmin(T1 &a, T2 b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T1, class T2> inline bool chmax(T1 &a, T2 b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  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 half = 1 << 10;
  vector<vector<int>> use(half);
  for (int mask = 0; mask < (half); ++mask) {
    for (int i = 0; i < 10; ++i) {
      if (mask & 1 << i) {
        use[mask].emplace_back(i);
      }
    }
  }
  vector<vector<pair<int, int>>> dp_small(half);
  for (int mask = 1; mask < min(N + 1, half); ++mask) {
    vector<int> pv, pw;
    int v = mask;
    for (;; v >>= 1) {
      pv.emplace_back(V[v]);
      pw.emplace_back(W[v]);
      if (v == 1)
        break;
    }
    int n = pv.size();
    for (int bit = 0; bit < (1 << n); ++bit) {
      int sumv = 0, sumw = 0;
      for (int x : use[bit]) {
        if (x >= n)
          break;
        sumv += pv[x];
        sumw += pw[x];
      }
      dp_small[mask].emplace_back(sumw, sumv);
    }
    sort(ALL(dp_small[mask]));
    for (int i = 0; i + 1 < dp_small[mask].size(); ++i) {
      chmax(dp_small[mask][i + 1].second, dp_small[mask][i].second);
    }
  }
  int Q;
  cin >> Q;
  for (; Q--;) {
    int v, L;
    cin >> v >> L;
    if (v < half) {
      int ans = 0;
      for (auto x : dp_small[v]) {
        if (x.first <= L)
          chmax(ans, x.second);
        else
          break;
      }
      cout << ans << '\\n';
      continue;
    }
    vector<int> pv, pw;
    for (; v >= half; v >>= 1) {
      pv.emplace_back(V[v]);
      pw.emplace_back(W[v]);
    }
    int n = pv.size();
    vector<pair<int, int>> dp;
    for (int bit = 0; bit < (1 << n); ++bit) {
      int sumv = 0, sumw = 0;
      for (int x : use[bit]) {
        if (x >= n)
          break;
        sumv += pv[x];
        sumw += pw[x];
      }
      if (sumw > L)
        continue;
      dp.emplace_back(sumw, sumv);
    }
    sort(ALL(dp));
    int now = dp_small[v].size() - 1, ans = 0;
    for (int i = 0; i < dp.size(); ++i) {
      while (now >= 0 && dp_small[v][now].first > L - dp[i].first)
        --now;
      chmax(ans, dp[i].second + dp_small[v][now].second);
    }
    cout << ans << '\\n';
  }
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define REP(i, n) FOR(i, 0, n)
#define ALL(x) (x).begin(), (x).end()
const long long MOD = 1e9 + 7;
// const long long MOD=998244353;
const int INF = 1e9;
const long long IINF = 1e18;
const int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
const char dir[4] = {'D', 'R', 'U', 'L'};
#define LOCAL

template <typename T> istream &operator>>(istream &is, vector<T> &v) {
  for (T &x : v)
    is >> x;
  return is;
}
template <typename T> ostream &operator<<(ostream &os, const vector<T> &v) {
  for (int i = 0; i < v.size(); ++i) {
    os << v[i] << (i + 1 == v.size() ? "" : " ");
  }
  return os;
}
template <typename T, typename U>
ostream &operator<<(ostream &os, const pair<T, U> &p) {
  cout << '(' << p.first << ',' << p.second << ')';
  return os;
}
template <typename T, typename U>
ostream &operator<<(ostream &os, const map<T, U> &m) {
  os << '{';
  for (auto itr = m.begin(); itr != m.end(); ++itr) {
    os << '(' << itr->first << ',' << itr->second << ')';
    if (++itr != m.end())
      os << ',';
    --itr;
  }
  os << '}';
  return os;
}
template <typename T> ostream &operator<<(ostream &os, const set<T> &s) {
  os << '{';
  for (auto itr = s.begin(); itr != s.end(); ++itr) {
    os << *itr;
    if (++itr != s.end())
      os << ',';
    --itr;
  }
  os << '}';
  return os;
}

void debug_out() { cerr << '\\n'; }
template <class Head, class... Tail>
void debug_out(Head &&head, Tail &&...tail) {
  cerr << head;
  if (sizeof...(Tail) > 0)
    cerr << ", ";
  debug_out(move(tail)...);
}
#ifdef LOCAL
#define debug(...)                                                             \\
  cerr << " ";                                                                 \\
  cerr << #__VA_ARGS__ << " :[" << __LINE__ << ":" << __FUNCTION__ << "]"      \\
       << '\\n';                                                                \\
  cerr << " ";                                                                 \\
  debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif

template <typename T> T gcd(T x, T y) { return y != 0 ? gcd(y, x % y) : x; }
template <typename T> T lcm(T x, T y) { return x / gcd(x, y) * y; }

template <class T1, class T2> inline bool chmin(T1 &a, T2 b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T1, class T2> inline bool chmax(T1 &a, T2 b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  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;
  map<int, int> dp;
  set<int> s;
  for (; Q--;) {
    int v, L;
    cin >> v >> L;
    if (v == 1) {
      if (W[v] <= L) {
        cout << V[v] << '\\n';
      } else
        cout << 0 << '\\n';
      continue;
    }
    vector<int> pv, pw;
    for (;; v >>= 1) {
      pv.emplace_back(V[v]);
      pw.emplace_back(W[v]);
      if (v == 1)
        break;
    }
    int n = pv.size(), h = n / 2;
    if (h == 9)
      ++h;
    dp.clear();
    s.clear();
    for (int mask = 0; mask < (1 << h); ++mask) {
      int sumv = 0, sumw = 0;
      for (int i = 0; i < h; ++i) {
        if (mask & 1 << i) {
          sumv += pv[i];
          sumw += pw[i];
        }
      }
      if (sumw > L)
        continue;
      dp[sumw] = max(dp[sumw], sumv);
      s.emplace(sumw);
    }
    /*vector<pair<int,int>> vw;
    for (auto x:dp) vw.emplace_back(x.first,x.second);
    sort(ALL(vw));
    int nn=vw.size();
    for (int i=0;i<nn-1;++i) vw[i+1].second=max(vw[i+1].second,vw[i].second);*/
    int M = 0;
    for (auto x : dp) {
      chmax(M, x.second);
      chmax(dp[x.first], M);
    }
    int ans = 0;
    for (int mask = 0; mask < (1 << (n - h)); ++mask) {
      int sumv = 0, sumw = 0;
      for (int i = 0; i < n - h; ++i) {
        if (mask & 1 << i) {
          sumv += pv[h + i];
          sumw += pw[h + i];
        }
      }
      if (sumw > L)
        continue;
      auto itr = s.upper_bound(L - sumw);
      int ww = *(--itr);
      // int pos=upper_bound(ALL(vw),make_pair(L-sumw,INF))-vw.begin(); --pos;
      chmax(ans, sumv + dp[ww]);
    }
    cout << ans << '\\n';
  }
}