Problem p03313 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
#define gc getchar()
inline int read() {
  int x = 0, f = 1;
  char c = gc;
  for (; c < 48 || c > 57; c = gc)
    if (c == '-')
      f = -1;
  for (; c > 47 && c < 58; c = gc)
    x = x * 10 + c - 48;
  return x * f;
}
#define io read()

#define maxn 100005
#define maxm 3000005
int n, m, a[maxn];
int st[maxn], pv[maxm], p1[maxm], tot;
int in[maxn];
inline void side(int u, int v) {
  pv[++tot] = v;
  p1[tot] = st[u];
  st[u] = tot;
  ++in[v];
}

inline void init() {
  n = io;
  m = 1 << n;
  for (int i = 0; i < m; ++i)
    a[i] = io;
  for (int i = 0; i < m; ++i) {
    for (int b = 1; b <= i; b <<= 1) {
      if (i & b)
        side(i, i ^ b);
    }
  }
}

int q[maxn], l, r;
int dp[maxn], ans;
struct pi {
  int x, y;
  pi(int xx = 0, int yy = 0) : x(xx), y(yy) {}
};
pi mx[maxn];

int b[100];
inline bool cmp(int x, int y) { return a[x] > a[y] || a[x] == a[y] && x > y; }

inline void solve() {
  l = 1;
  r = 0;
  for (int i = 0; i < m; ++i)
    if (!in[i])
      q[++r] = i;
  while (l <= r) {
    int x = q[l++];
    for (int i = st[x]; i; i = p1[i]) {
      int v = pv[i];
      if (!--in[v])
        q[++r] = v;
    }
  }

  a[m] = dp[m] = 0;
  for (int i = r; i; --i) {
    int x = q[i];
    int cnt = 0;
    b[++cnt] = x;
    b[++cnt] = m;
    for (int j = st[x]; j; j = p1[j]) {
      int v = pv[j];
      b[++cnt] = mx[v].x;
      b[++cnt] = mx[v].y;
    }
    sort(b + 1, b + cnt + 1, cmp);
    cnt = unique(b + 1, b + cnt + 1) - b - 1;
    mx[x] = pi(b[1], b[2]);
    dp[x] = a[b[1]] + a[b[2]];
  }

  for (int i = 1; i < m; ++i)
    dp[i] = max(dp[i - 1], dp[i]);
  for (int i = 1; i < m; ++i)
    printf("%d\n", dp[i]);
}

int main() {
  init();
  solve();
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
#define gc getchar()
inline int read() {
  int x = 0, f = 1;
  char c = gc;
  for (; c < 48 || c > 57; c = gc)
    if (c == '-')
      f = -1;
  for (; c > 47 && c < 58; c = gc)
    x = x * 10 + c - 48;
  return x * f;
}
#define io read()

#define maxn 1000005
#define maxm 10000005
int n, m, a[maxn];
int st[maxn], pv[maxm], p1[maxm], tot;
int in[maxn];
inline void side(int u, int v) {
  pv[++tot] = v;
  p1[tot] = st[u];
  st[u] = tot;
  ++in[v];
}

inline void init() {
  n = io;
  m = 1 << n;
  for (int i = 0; i < m; ++i)
    a[i] = io;
  for (int i = 0; i < m; ++i) {
    for (int b = 1; b <= i; b <<= 1) {
      if (i & b)
        side(i, i ^ b);
    }
  }
}

int q[maxn], l, r;
int dp[maxn], ans;
struct pi {
  int x, y;
  pi(int xx = 0, int yy = 0) : x(xx), y(yy) {}
};
pi mx[maxn];

int b[100];
inline bool cmp(int x, int y) { return a[x] > a[y] || a[x] == a[y] && x > y; }

inline void solve() {
  l = 1;
  r = 0;
  for (int i = 0; i < m; ++i)
    if (!in[i])
      q[++r] = i;
  while (l <= r) {
    int x = q[l++];
    for (int i = st[x]; i; i = p1[i]) {
      int v = pv[i];
      if (!--in[v])
        q[++r] = v;
    }
  }

  a[m] = dp[m] = 0;
  for (int i = r; i; --i) {
    int x = q[i];
    int cnt = 0;
    b[++cnt] = x;
    b[++cnt] = m;
    for (int j = st[x]; j; j = p1[j]) {
      int v = pv[j];
      b[++cnt] = mx[v].x;
      b[++cnt] = mx[v].y;
    }
    sort(b + 1, b + cnt + 1, cmp);
    cnt = unique(b + 1, b + cnt + 1) - b - 1;
    mx[x] = pi(b[1], b[2]);
    dp[x] = a[b[1]] + a[b[2]];
  }

  for (int i = 1; i < m; ++i)
    dp[i] = max(dp[i - 1], dp[i]);
  for (int i = 1; i < m; ++i)
    printf("%d\n", dp[i]);
}

int main() {
  init();
  solve();
  return 0;
}