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

#include <bits/stdc++.h>
#define For(i, x, y) for (register int i = (x); i <= (y); i++)
#define FOR(i, x, y) for (register int i = (x); i < (y); i++)
#define Dow(i, x, y) for (register int i = (x); i >= (y); i--)
#define Debug(v)                                                               \\
  for (auto i : v)                                                             \\
    printf("%lld ", i);                                                        \\
  puts("")
#define mp make_pair
#define fi first
#define se second
#define pb push_back
#define ep emplace_back
#define siz(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
#define fil(a, b) memset((a), (b), sizeof(a))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pa;
typedef pair<ll, ll> PA;
typedef vector<int> poly;
inline ll read() {
  ll x = 0, f = 1;
  char c = getchar();
  while ((c < '0' || c > '9') && (c != '-'))
    c = getchar();
  if (c == '-')
    f = -1, c = getchar();
  while (c >= '0' && c <= '9')
    x = x * 10 + c - '0', c = getchar();
  return x * f;
}

const int N = 1 << 18 | 3, mod = 1e9 + 7;
int h, cnt, n, p[N];

inline int power(int a, int b) {
  int ret = 1;
  for (; b; b >>= 1, a = 1ll * a * a % mod)
    if (b & 1)
      ret = 1ll * ret * a % mod;
  return ret;
}
inline int Mod(int x) { return x >= mod ? x - mod : x; }

int Tim, l[N], r[N], f[N], invf[N], inv[N];
poly v[N];
inline void dfs(int u) {
  invf[u] = power(f[u], mod - 2);
  if (p[u])
    return l[u] = r[u] = u, void(0);
  f[u << 1] = 1ll * f[u] * (u << 1) % mod;
  f[u << 1 ^ 1] = 1ll * f[u] * (u << 1 ^ 1) % mod;
  dfs(u << 1), dfs(u << 1 ^ 1);
  l[u] = l[u << 1], r[u] = r[u << 1 ^ 1];
}
int ans, flag[N], ip[N];
inline void dfs2(int u) {
  if (p[u])
    return v[u].pb(p[u] + cnt - 1), void(0);
  dfs2(u << 1), dfs2(u << 1 ^ 1);
  v[u] = v[u << 1];
  for (auto i : v[u << 1 ^ 1])
    v[u].pb(i);
  //	printf(" %d:\\n",u);
  //	for (auto i:v[u]) printf("%d ",i);puts("");
  for (auto i : v[u << 1]) {
    int tmp = 1ll * f[ip[i]] * invf[u] % mod * u % mod;
    for (int now = i; now; now >>= 1) {
      tmp = 1ll * tmp * now % mod, flag[now] = Mod(flag[now] + tmp);
    }
  }
  for (auto i : v[u << 1 ^ 1]) {
    int tmp = 1ll * f[ip[i]] * invf[u] % mod, tmp2 = i;
    for (int las = i, now = i >> 1; now; las = now, now >>= 1) {
      tmp2 = 1ll * tmp2 * now % mod;
      if (now * 2 == las) {
        ans = (ans + 1ll * flag[now * 2 + 1] * tmp % mod * tmp2) % mod;
      } else {
        ans = (ans + 1ll * flag[now * 2] * tmp % mod * tmp2) % mod;
      }
    }
  }
  for (auto i : v[u << 1])
    for (int now = i; now; now >>= 1)
      flag[now] = 0;
}

int main() {
  h = read(), cnt = 1 << (h - 1), n = cnt * 2 - 1;
  For(i, 1, cnt) p[cnt + i - 1] = read(),
                             ip[p[cnt + i - 1] + cnt - 1] = cnt + i - 1;
  For(i, 1, n) inv[i] = power(i, mod - 2);
  f[1] = invf[1] = 1, dfs(1), dfs2(1), printf("%d\\n", ans);
}

Error: 0

Fixed submission:

#include <bits/stdc++.h>
#define For(i, x, y) for (register int i = (x); i <= (y); i++)
#define FOR(i, x, y) for (register int i = (x); i < (y); i++)
#define Dow(i, x, y) for (register int i = (x); i >= (y); i--)
#define Debug(v)                                                               \\
  for (auto i : v)                                                             \\
    printf("%lld ", i);                                                        \\
  puts("")
#define mp make_pair
#define fi first
#define se second
#define pb push_back
#define ep emplace_back
#define siz(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
#define fil(a, b) memset((a), (b), sizeof(a))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pa;
typedef pair<ll, ll> PA;
typedef vector<int> poly;
inline ll read() {
  ll x = 0, f = 1;
  char c = getchar();
  while ((c < '0' || c > '9') && (c != '-'))
    c = getchar();
  if (c == '-')
    f = -1, c = getchar();
  while (c >= '0' && c <= '9')
    x = x * 10 + c - '0', c = getchar();
  return x * f;
}

const int N = 1 << 18 | 3, mod = 1e9 + 7;
int h, cnt, n, p[N];

inline int power(int a, int b) {
  int ret = 1;
  for (; b; b >>= 1, a = 1ll * a * a % mod)
    if (b & 1)
      ret = 1ll * ret * a % mod;
  return ret;
}
inline int Mod(int x) { return x >= mod ? x - mod : x; }

int Tim, l[N], r[N], f[N], invf[N], inv[N];
poly v[N];
inline void dfs(int u) {
  invf[u] = power(f[u], mod - 2);
  if (p[u])
    return l[u] = r[u] = u, void(0);
  f[u << 1] = 1ll * f[u] * (u << 1) % mod;
  f[u << 1 ^ 1] = 1ll * f[u] * (u << 1 ^ 1) % mod;
  dfs(u << 1), dfs(u << 1 ^ 1);
  l[u] = l[u << 1], r[u] = r[u << 1 ^ 1];
}
int ans, flag[N], ip[N];
inline void dfs2(int u) {
  if (p[u])
    return v[u].pb(p[u] + cnt - 1), void(0);
  dfs2(u << 1), dfs2(u << 1 ^ 1);
  int l = 0, L = 0;
  while (l < siz(v[u << 1]) || L < siz(v[u << 1 ^ 1]))
    if (l == siz(v[u << 1]) || v[u << 1 ^ 1][L] < v[u << 1][l])
      v[u].pb(v[u << 1 ^ 1][L]), ++L;
    else
      v[u].pb(v[u << 1][l]), l++;
  //	printf(" %d:\\n",u);
  //	for (auto i:v[u]) printf("%d ",i);puts("");
  for (auto i : v[u << 1]) {
    int tmp = 1ll * f[ip[i]] * invf[u] % mod * u % mod;
    for (int now = i; now; now >>= 1) {
      tmp = 1ll * tmp * now % mod, flag[now] = Mod(flag[now] + tmp);
    }
  }
  for (auto i : v[u << 1 ^ 1]) {
    int tmp = 1ll * f[ip[i]] * invf[u] % mod, tmp2 = i;
    for (int las = i, now = i >> 1; now; las = now, now >>= 1) {
      tmp2 = 1ll * tmp2 * now % mod;
      if (now * 2 == las) {
        ans = (ans + 1ll * flag[now * 2 + 1] * tmp % mod * tmp2) % mod;
      } else {
        ans = (ans + 1ll * flag[now * 2] * tmp % mod * tmp2) % mod;
      }
    }
  }
  for (auto i : v[u << 1])
    for (int now = i; now; now >>= 1)
      flag[now] = 0;
}

int main() {
  h = read(), cnt = 1 << (h - 1), n = cnt * 2 - 1;
  For(i, 1, cnt) p[cnt + i - 1] = read(),
                             ip[p[cnt + i - 1] + cnt - 1] = cnt + i - 1;
  For(i, 1, n) inv[i] = power(i, mod - 2);
  f[1] = invf[1] = 1, dfs(1), dfs2(1), printf("%d\\n", ans);
}