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

#include <bits/stdc++.h>
#include <tr1/unordered_map>
#define ri register int
#define ptf printf
using namespace std;
typedef double db;
typedef long double ld;
typedef long long ll;
typedef vector<int> poly;
typedef pair<int, int> pii;
typedef pair<ll, int> pli;
typedef pair<int, ll> pil;
typedef pair<ll, ll> pll;
typedef unsigned long long ulll;
typedef unsigned int uii;
typedef string strr;
#define fi first
#define se second
#define pb push_back
#define ppp pop_back
#define rez resize
const ll Inf = 2e18;
const int rlen = 1 << 20, inf = 0x3f3f3f3f;
char buf[rlen], *ib = buf, *ob = buf;
#define gc()                                                                   \\
  getchar() //(((ib == ob) && (ob = (ib =  buf) + fread(buf, 1, rlen, stdin)),
            //ib == ob) ? -1 : *ib++)
inline int read() {
  static int ans, f;
  static char ch;
  ans = 0, ch = gc(), f = 1;
  while (!isdigit(ch))
    f ^= ch == '-', ch = gc();
  while (isdigit(ch))
    ans = (ans << 3) + (ans << 1) + (ch ^ 48), ch = gc();
  return f ? ans : -ans;
}
inline ll readl() {
  static ll ans;
  static char ch;
  for (ans = 0, ch = gc(); !isdigit(ch); ch = gc())
    ;
  while (isdigit(ch))
    ans = ((ans << 2) + ans << 1) + (ch ^ 48), ch = gc();
  return ans;
}
inline int Read(char *s) {
  static int top;
  static char ch;
  top = 0, ch = gc();
  while (!isalpha(ch) && !isdigit(ch))
    ch = gc();
  while (isalpha(ch) || isdigit(ch))
    s[++top] = ch, ch = gc();
  return top;
}
namespace modular {
const int mod = 998244353; //= 1e9 + 7;
// int mod;
int ret;
inline int add(int a, int b) { return a + b < mod ? a + b : a + b - mod; }
inline int dec(int a, int b) { return a < b ? a - b + mod : a - b; }
inline int mul(int a, int b) { return (ll)a * b % mod; }
inline void Add(int &a, int b) { a = a + b < mod ? a + b : a + b - mod; }
inline void Dec(int &a, int b) { a = a < b ? a - b + mod : a - b; }
inline void Mul(int &a, int b) { a = (ll)a * b % mod; }
inline int ksm(int a, int p) {
  for (ret = 1; p; p >>= 1, Mul(a, a))
    (p & 1) && (Mul(ret, a), 1);
  return ret;
}
inline int Inv(int a) { return ksm(a, mod - 2); }
inline int sqr(int a) { return (ll)a * a % mod; }
inline int cub(int a) { return (ll)a * a % mod * a % mod; }
} // namespace modular
using namespace modular;
template <typename T> inline void ckmax(T &a, T b) { a < b ? a = b : 0; }
template <typename T> inline void ckmin(T &a, T b) { a > b ? a = b : 0; }
template <typename T> inline T Abs(T a) { return a < 0 ? -a : a; }
template <typename T> inline T gcd(T a, T b) {
  T t;
  while (b)
    t = a, a = b, b = t - t / a * a;
  return a;
}
template <typename T> inline void exgcd(T a, T b, T &x, T &y) {
  if (!b) {
    x = 1, y = 0;
    return;
  }
  exgcd(b, a - a / b * b, y, x);
  y -= a / b * x;
}
const int N = 1 << 18 | 5;
int n, m, maxl = 0;
int dep[N];
pii a[N], qry[N];
vector<pii> f[N];
int main() {
#ifdef ldxcaicai
  freopen("lx.in", "r", stdin);
#endif
  n = read();
  for (ri i = 1; i <= n; ++i)
    a[i].se = read(), a[i].fi = read(), dep[i] = dep[i >> 1] + 1;
  m = read();
  for (ri i = 1; i <= m; ++i)
    qry[i].fi = read(), qry[i].se = read(), ckmax(maxl, qry[i].se);
  f[0].pb(pii(0, 0));
  for (ri i = 1; i <= n; ++i)
    if (dep[i] <= 9) {
      vector<pii> vl, nw, tp;
      vl.pb(pii(0, 0));
      for (ri d = 1, p = i; p && d <= 9; ++d, p >>= 1) {
        for (ri j = 0; j < vl.size(); ++j)
          if (vl[j].fi + a[p].fi <= maxl)
            nw.pb(pii(vl[j].fi + a[p].fi, vl[j].se + a[p].se));
        int p1 = 0, p2 = 0;
        while (p1 < vl.size() && p2 < nw.size()) {
          if (vl[p1].fi == nw[p2].fi)
            ckmax(vl[p1].se, nw[p2++].se);
          else if (vl[p1].fi < nw[p2].fi)
            tp.pb(vl[p1++]);
          else
            tp.pb(nw[p2++]);
        }
        while (p1 < vl.size()) {
          if (tp.back().se == vl[p1].se)
            ckmax(tp.back().se, vl[p1++].se);
          else
            tp.pb(vl[p1++]);
        }
        while (p2 < nw.size()) {
          if (tp.back().se == nw[p2].se)
            ckmax(tp.back().se, nw[p2++].se);
          else
            tp.pb(nw[p2++]);
        }
        vl = tp, tp.rez(0), nw.rez(0);
      }
      f[i] = vl;
      for (ri j = 1; j < f[i].size(); ++j)
        ckmax(f[i][j].se, f[i][j - 1].se);
    }
  for (ri i = 1; i <= m; ++i) {
    int V = qry[i].fi, W = qry[i].se, ans, ps;
    if (dep[V] <= 9) {
      ans = 0, ps = V >> 9;
      for (ri j = 0, k = (int)f[ps].size() - 1; j < f[V].size(); ++j) {
        while (k && f[ps][k].fi + f[V][j].fi > W)
          --k;
        if (f[ps][k].fi + f[V][j].fi <= W)
          ckmax(ans, f[ps][k].se + f[V][j].se);
      }
      cout << ans << '\\n';
    } else {
      vector<pii> vl, nw, tp;
      vl.pb(pii(0, 0));
      for (ri d = 1, p = V; p && d <= 9; ++d, p >>= 1) {
        for (ri j = 0; j < vl.size(); ++j)
          if (vl[j].fi + a[p].fi <= maxl)
            nw.pb(pii(vl[j].fi + a[p].fi, vl[j].se + a[p].se));
        int p1 = 0, p2 = 0;
        while (p1 < vl.size() && p2 < nw.size()) {
          if (vl[p1].fi == nw[p2].fi)
            ckmax(vl[p1].se, nw[p2++].se);
          else if (vl[p1].fi < nw[p2].fi)
            tp.pb(vl[p1++]);
          else
            tp.pb(nw[p2++]);
        }
        while (p1 < vl.size()) {
          if (tp.back().se == vl[p1].se)
            ckmax(tp.back().se, vl[p1++].se);
          else
            tp.pb(vl[p1++]);
        }
        while (p2 < nw.size()) {
          if (tp.back().se == nw[p2].se)
            ckmax(tp.back().se, nw[p2++].se);
          else
            tp.pb(nw[p2++]);
        }
        vl = tp, tp.rez(0), nw.rez(0);
      }
      ans = 0, ps = V >> 9;
      for (ri j = 0, k = (int)f[ps].size() - 1; j < vl.size(); ++j) {
        while (k && f[ps][k].fi + vl[j].fi > W)
          --k;
        if (f[ps][k].fi + vl[j].fi <= W)
          ckmax(ans, f[ps][k].se + vl[j].se);
      }
      cout << ans << '\\n';
    }
  }
  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#include <tr1/unordered_map>
#define ri register int
#define ptf printf
using namespace std;
typedef double db;
typedef long double ld;
typedef long long ll;
typedef vector<int> poly;
typedef pair<int, int> pii;
typedef pair<ll, int> pli;
typedef pair<int, ll> pil;
typedef pair<ll, ll> pll;
typedef unsigned long long ulll;
typedef unsigned int uii;
typedef string strr;
#define fi first
#define se second
#define pb push_back
#define ppp pop_back
#define rez resize
const ll Inf = 2e18;
const int rlen = 1 << 20, inf = 0x3f3f3f3f;
char buf[rlen], *ib = buf, *ob = buf;
#define gc()                                                                   \\
  getchar() //(((ib == ob) && (ob = (ib =  buf) + fread(buf, 1, rlen, stdin)),
            //ib == ob) ? -1 : *ib++)
inline int read() {
  static int ans, f;
  static char ch;
  ans = 0, ch = gc(), f = 1;
  while (!isdigit(ch))
    f ^= ch == '-', ch = gc();
  while (isdigit(ch))
    ans = (ans << 3) + (ans << 1) + (ch ^ 48), ch = gc();
  return f ? ans : -ans;
}
inline ll readl() {
  static ll ans;
  static char ch;
  for (ans = 0, ch = gc(); !isdigit(ch); ch = gc())
    ;
  while (isdigit(ch))
    ans = ((ans << 2) + ans << 1) + (ch ^ 48), ch = gc();
  return ans;
}
inline int Read(char *s) {
  static int top;
  static char ch;
  top = 0, ch = gc();
  while (!isalpha(ch) && !isdigit(ch))
    ch = gc();
  while (isalpha(ch) || isdigit(ch))
    s[++top] = ch, ch = gc();
  return top;
}
namespace modular {
const int mod = 998244353; //= 1e9 + 7;
// int mod;
int ret;
inline int add(int a, int b) { return a + b < mod ? a + b : a + b - mod; }
inline int dec(int a, int b) { return a < b ? a - b + mod : a - b; }
inline int mul(int a, int b) { return (ll)a * b % mod; }
inline void Add(int &a, int b) { a = a + b < mod ? a + b : a + b - mod; }
inline void Dec(int &a, int b) { a = a < b ? a - b + mod : a - b; }
inline void Mul(int &a, int b) { a = (ll)a * b % mod; }
inline int ksm(int a, int p) {
  for (ret = 1; p; p >>= 1, Mul(a, a))
    (p & 1) && (Mul(ret, a), 1);
  return ret;
}
inline int Inv(int a) { return ksm(a, mod - 2); }
inline int sqr(int a) { return (ll)a * a % mod; }
inline int cub(int a) { return (ll)a * a % mod * a % mod; }
} // namespace modular
using namespace modular;
template <typename T> inline void ckmax(T &a, T b) { a < b ? a = b : 0; }
template <typename T> inline void ckmin(T &a, T b) { a > b ? a = b : 0; }
template <typename T> inline T Abs(T a) { return a < 0 ? -a : a; }
template <typename T> inline T gcd(T a, T b) {
  T t;
  while (b)
    t = a, a = b, b = t - t / a * a;
  return a;
}
template <typename T> inline void exgcd(T a, T b, T &x, T &y) {
  if (!b) {
    x = 1, y = 0;
    return;
  }
  exgcd(b, a - a / b * b, y, x);
  y -= a / b * x;
}
const int N = 1 << 18 | 5;
int n, m, maxl = 0;
int dep[N];
pii a[N], qry[N];
vector<pii> f[N];
int main() {
#ifdef ldxcaicai
  freopen("lx.in", "r", stdin);
#endif
  n = read();
  for (ri i = 1; i <= n; ++i)
    a[i].se = read(), a[i].fi = read(), dep[i] = dep[i >> 1] + 1;
  m = read();
  for (ri i = 1; i <= m; ++i)
    qry[i].fi = read(), qry[i].se = read(), ckmax(maxl, qry[i].se);
  f[0].pb(pii(0, 0));
  for (ri i = 1; i <= n; ++i) {
    vector<pii> vl, nw, tp;
    vl.pb(pii(0, 0));
    for (ri d = 1, p = i; p && d <= 9; ++d, p >>= 1) {
      for (ri j = 0; j < vl.size(); ++j)
        if (vl[j].fi + a[p].fi <= maxl)
          nw.pb(pii(vl[j].fi + a[p].fi, vl[j].se + a[p].se));
      int p1 = 0, p2 = 0;
      while (p1 < vl.size() && p2 < nw.size()) {
        if (vl[p1].fi == nw[p2].fi)
          ckmax(vl[p1].se, nw[p2++].se);
        else if (vl[p1].fi < nw[p2].fi)
          tp.pb(vl[p1++]);
        else
          tp.pb(nw[p2++]);
      }
      while (p1 < vl.size()) {
        if (tp.back().se == vl[p1].se)
          ckmax(tp.back().se, vl[p1++].se);
        else
          tp.pb(vl[p1++]);
      }
      while (p2 < nw.size()) {
        if (tp.back().se == nw[p2].se)
          ckmax(tp.back().se, nw[p2++].se);
        else
          tp.pb(nw[p2++]);
      }
      vl = tp, tp.rez(0), nw.rez(0);
    }
    f[i] = vl;
    for (ri j = 1; j < f[i].size(); ++j)
      ckmax(f[i][j].se, f[i][j - 1].se);
  }
  for (ri i = 1; i <= m; ++i) {
    int V = qry[i].fi, W = qry[i].se, ans = 0, ps = V >> 9;
    for (ri j = 0, k = (int)f[ps].size() - 1; j < f[V].size(); ++j) {
      while (k && f[ps][k].fi + f[V][j].fi > W)
        --k;
      if (f[ps][k].fi + f[V][j].fi <= W)
        ckmax(ans, f[ps][k].se + f[V][j].se);
    }
    cout << ans << '\\n';
  }
  return 0;
}