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

#include <bits/stdc++.h>

using namespace std;

#define REP(i, n) for (int i = 0; i < (n); ++i)
#define RREP(i, n) for (int i = (int)(n)-1; i >= 0; --i)
#define FOR(i, a, n) for (int i = (a); i < (n); ++i)
#define RFOR(i, a, n) for (int i = (int)(n)-1; i >= (a); --i)

#define SZ(x) ((int)(x).size())
#define ALL(x) (x).begin(), (x).end()

#define DUMP(x) cerr << #x << " = " << (x) << endl
#define DEBUG(x) cerr << #x << " = " << (x) << " (L" << __LINE__ << ")" << endl;

template <class T> ostream &operator<<(ostream &os, const vector<T> &v) {
  os << "[";
  REP(i, SZ(v)) {
    if (i)
      os << ", ";
    os << v[i];
  }
  return os << "]";
}

template <class T, class U>
ostream &operator<<(ostream &os, const pair<T, U> &p) {
  return os << "(" << p.first << " " << p.second << ")";
}

template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}

template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return true;
  }
  return false;
}

using ll = long long;
using ull = unsigned long long;
using ld = long double;
using vi = vector<int>;
using vll = vector<ll>;
using vvi = vector<vi>;
using vvll = vector<vll>;

const ll MOD = 1e9 + 7;
const int INF = INT_MAX / 2;
const ll LINF = LLONG_MAX / 2;
const ld eps = 1e-9;

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(10);

  // ifstream in("in.txt");
  // cin.rdbuf(in.rdbuf());

  int N;
  cin >> N;
  vector<int> V(N + 1), W(N + 1);
  FOR(i, 1, N + 1) { cin >> V[i] >> W[i]; }

  int M = sqrt(N);

  const int MAX_L = 1e5;
  vector<vector<ll>> dp(M, vector<ll>(MAX_L + 1));

  FOR(i, 1, M) {
    dp[i] = dp[i / 2];
    for (int w = 0; w <= MAX_L - W[i]; ++w) {
      chmax(dp[i][w + W[i]], dp[i / 2][w] + V[i]);
    }
  }

  int Q;
  cin >> Q;
  REP(i, Q) {
    ll v, L;
    cin >> v >> L;

    vector<int> ids;
    int u = v;
    while (u >= M) {
      ids.push_back(u);
      u >>= 1;
    }

    ll ans = 0;
    for (int s = 0; s < 1 << SZ(ids); ++s) {
      ll totalv = 0, totalw = 0;
      REP(j, SZ(ids)) {
        if (s >> j & 1) {
          totalv += V[ids[j]];
          totalw += W[ids[j]];
        }
      }

      if (totalw > L)
        continue;
      chmax(ans, dp[u][L - totalw] + totalv);
    }

    cout << ans << '\\n';
  }

  return 0;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>

using namespace std;

#define REP(i, n) for (int i = 0; i < (n); ++i)
#define RREP(i, n) for (int i = (int)(n)-1; i >= 0; --i)
#define FOR(i, a, n) for (int i = (a); i < (n); ++i)
#define RFOR(i, a, n) for (int i = (int)(n)-1; i >= (a); --i)

#define SZ(x) ((int)(x).size())
#define ALL(x) (x).begin(), (x).end()

#define DUMP(x) cerr << #x << " = " << (x) << endl
#define DEBUG(x) cerr << #x << " = " << (x) << " (L" << __LINE__ << ")" << endl;

template <class T> ostream &operator<<(ostream &os, const vector<T> &v) {
  os << "[";
  REP(i, SZ(v)) {
    if (i)
      os << ", ";
    os << v[i];
  }
  return os << "]";
}

template <class T, class U>
ostream &operator<<(ostream &os, const pair<T, U> &p) {
  return os << "(" << p.first << " " << p.second << ")";
}

template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}

template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return true;
  }
  return false;
}

using ll = long long;
using ull = unsigned long long;
using ld = long double;
using vi = vector<int>;
using vll = vector<ll>;
using vvi = vector<vi>;
using vvll = vector<vll>;

const ll MOD = 1e9 + 7;
const int INF = INT_MAX / 2;
const ll LINF = LLONG_MAX / 2;
const ld eps = 1e-9;

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(10);

  // ifstream in("in.txt");
  // cin.rdbuf(in.rdbuf());

  int N;
  cin >> N;
  vector<int> V(N + 1), W(N + 1);
  FOR(i, 1, N + 1) { cin >> V[i] >> W[i]; }

  int M = sqrt(N);

  const int MAX_L = 1e5;
  vector<vector<ll>> dp(M, vector<ll>(MAX_L + 1));

  FOR(i, 1, M) {
    for (int v = i; v > 0; v >>= 1) {
      for (int w = MAX_L - W[v]; w >= 0; --w) {
        chmax(dp[i][w + W[v]], dp[i][w] + V[v]);
      }
    }
    REP(w, MAX_L) { chmax(dp[i][w + 1], dp[i][w]); }
  }

  int Q;
  cin >> Q;
  REP(i, Q) {
    ll v, L;
    cin >> v >> L;

    vector<int> ids;
    int u = v;
    while (u >= M) {
      ids.push_back(u);
      u >>= 1;
    }

    ll ans = 0;
    for (int s = 0; s < 1 << SZ(ids); ++s) {
      ll totalv = 0, totalw = 0;
      REP(j, SZ(ids)) {
        if (s >> j & 1) {
          totalv += V[ids[j]];
          totalw += W[ids[j]];
        }
      }

      if (totalw > L)
        continue;
      chmax(ans, dp[u][L - totalw] + totalv);
    }

    cout << ans << endl;
  }

  return 0;
}