Problem p02648 (C++) — buggy submission, verdict: Runtime Error

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> P;
const int N = 27e4, M = 4099;
int n, V[N], W[N], Q, x, y, i, j, k;
P val[M][M], a[M], b[M];
int le[M], xb, vv[29], ww[29], xb2;
inline void calc() {
  xb = 0;
  for (j = 0; j < 1 << xb2; ++j) {
    int x = 0, y = 0;
    for (k = 0; k < xb2; ++k)
      if (j >> k & 1)
        x += vv[k], y += ww[k];
    if (x <= 100000)
      a[xb++] = {x, y};
  }
  sort(a, a + xb);
  int xbb = 0;
  for (j = 0; j < xb; ++j)
    if (!xbb || b[xbb - 1].second < a[j].second)
      b[xbb++] = a[j];
  xb = xbb;
  memcpy(a, b, xb << 3);
}
int main() {
  scanf("%d", &n);
  for (i = 1; i <= n; ++i)
    scanf("%d%d", W + i, V + i);
  for (i = 1; i <= n && i < 4096; ++i) {
    //		xb2=0;for(j=i;j;j=j+1>>1){vv[xb2]=V[j],ww[xb2++]=W[j];if(j==1)break;}
    xb2 = 0;
    for (j = i; j; j = j >> 1) {
      vv[xb2] = V[j], ww[xb2++] = W[j];
      if (j == 1)
        break;
    }
    calc();
    le[i] = xb;
    memcpy(val[i], a, xb << 3);
  }
  for (scanf("%d", &Q); Q--;) {
    scanf("%d%d", &x, &y);
    if (x < 4096) {
      printf("%d\\n",
             upper_bound(val[x], val[x] + le[x], P{y + 1, -1})[-1].second);
      continue;
    }
    xb2 = 0;
    for (j = x; j >= 4096; j = j >> 1)
      vv[xb2] = V[j], ww[xb2++] = W[j];
    int zz = j;
    calc();
    int ans = 0;
    for (j = 0; j < xb && a[j].first <= y; ++j)
      ans = max(ans, upper_bound(val[zz], val[zz] + le[zz],
                                 P{y - a[j].first + 1, -1})[-1]
                             .second +
                         a[j].second);
    printf("%d\\n", ans);
  }
  return 0;
}

Error: -11

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> P;
const int N = 27e4, M = 4099;
int n, V[N], W[N], Q, x, y, i, j, k;
P val[M][M], a[M], b[M];
int le[M], xb, vv[29], ww[29], xb2;
inline void calc() {
  xb = 0;
  for (j = 0; j < 1 << xb2; ++j) {
    int x = 0, y = 0;
    for (k = 0; k < xb2; ++k)
      if (j >> k & 1)
        x += vv[k], y += ww[k];
    if (x <= 100000)
      a[xb++] = {x, y};
  }
  sort(a, a + xb);
  int xbb = 0;
  for (j = 0; j < xb; ++j)
    if (!xbb || b[xbb - 1].second < a[j].second)
      b[xbb++] = a[j];
  xb = xbb;
  memcpy(a, b, xb << 3);
}
int main() {
  scanf("%d", &n);
  for (i = 1; i <= n; ++i)
    scanf("%d%d", W + i, V + i);
  for (i = 1; i <= n && i < 4096; ++i) {
    //		xb2=0;for(j=i;j;j=j+1>>1){vv[xb2]=V[j],ww[xb2++]=W[j];if(j==1)break;}
    xb2 = 0;
    for (j = i; j; j = j >> 1) {
      vv[xb2] = V[j], ww[xb2++] = W[j];
      if (j == 1)
        break;
    }
    calc();
    le[i] = xb;
    memcpy(val[i], a, xb << 3);
  }
  for (scanf("%d", &Q); Q--;) {
    scanf("%d%d", &x, &y);
    if (x < 4096) {
      printf("%d\\n",
             upper_bound(val[x], val[x] + le[x], P{y + 1, -1})[-1].second);
      continue;
    }
    xb2 = 0;
    for (j = i; j >= 4096; j = j >> 1)
      vv[xb2] = V[j], ww[xb2++] = W[j];
    calc();
    int ans = 0;
    for (j = 0; j < xb && a[j].first <= y; ++j)
      ans = max(ans, upper_bound(val[x], val[x] + le[x],
                                 P{y - a[j].first + 1, -1})[-1]
                             .second +
                         a[j].second);
    printf("%d\\n", ans);
  }
  return 0;
}