Problem p03499 (C++)

Buggy submission (status: Runtime Error):
#pragma region Macros
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define rep2(i, a, b) for (ll i = a; i <= b; ++i)
#define rep(i, n) for (ll i = 0; i < n; i++)
#define rep3(i, a, b) for (ll i = a; i >= b; i--)
#define pii pair<int, int>
#define pll pair<ll, ll>
#define pq priority_queue
#define pb push_back
#define eb emplace_back
#define vec vector<int>
#define vecll vector<ll>
#define vecpii vector<pii>
#define vecpll vector<pll>
#define vec2(a, b) vector<vec>(a, vec(b))
#define vec2ll(a, b) vector<vecll>(a, vecll(b))
#define vec3(a, b, c) vector<vector<vec>>(a, vec2(b, c))
#define vec3ll(a, b, c) vector<vector<vecll>>(a, vec2ll(b, c))
#define fi first
#define se second
#define endl "\n"
#define all(c) begin(c), end(c)
#define ios ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
#define lb(c, x) distance(c.begin(), lower_bound(all(c), (x)))
#define ub(c, x) distance(c.begin(), upper_bound(all(c), (x)))
using namespace std;
int in() {
  int x;
  cin >> x;
  return x;
}
ll lin() {
  ll x;
  cin >> x;
  return x;
}
string stin() {
  string s;
  cin >> s;
  return s;
}
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
vec iota(int n) {
  vec a(n);
  iota(all(a), 0);
  return a;
}
void print() { putchar(' '); }
void print(bool a) { cout << a; }
void print(int a) { cout << a; }
void print(long long a) { cout << a; }
void print(char a) { cout << a; }
void print(string &a) { cout << a; }
void print(double a) { cout << a; }
template <class T> void print(const vector<T> &);
template <class T, size_t size> void print(const array<T, size> &);
template <class T, class L> void print(const pair<T, L> &p);
template <class T, size_t size> void print(const T (&)[size]);
template <class T> void print(const vector<T> &a) {
  if (a.empty())
    return;
  print(a[0]);
  for (auto i = a.begin(); ++i != a.end();) {
    cout << " ";
    print(*i);
  }
  cout << endl;
}
template <class T> void print(const deque<T> &a) {
  if (a.empty())
    return;
  print(a[0]);
  for (auto i = a.begin(); ++i != a.end();) {
    cout << " ";
    print(*i);
  }
}
template <class T, size_t size> void print(const array<T, size> &a) {
  print(a[0]);
  for (auto i = a.begin(); ++i != a.end();) {
    cout << " ";
    print(*i);
  }
}
template <class T, class L> void print(const pair<T, L> &p) {
  cout << '(';
  print(p.first);
  cout << ",";
  print(p.second);
  cout << ')';
}
template <class T, size_t size> void print(const T (&a)[size]) {
  print(a[0]);
  for (auto i = a; ++i != end(a);) {
    cout << " ";
    print(*i);
  }
}
template <class T> void print(const T &a) { cout << a; }
int out() {
  putchar('\n');
  return 0;
}
template <class T> int out(const T &t) {
  print(t);
  putchar('\n');
  return 0;
}
template <class Head, class... Tail>
int out(const Head &head, const Tail &...tail) {
  print(head);
  putchar(' ');
  out(tail...);
  return 0;
}
ll gcd(ll a, ll b) {
  while (b) {
    ll c = b;
    b = a % b;
    a = c;
  }
  return a;
}
ll lcm(ll a, ll b) {
  if (!a || !b)
    return 0;
  return a * b / gcd(a, b);
}
#define _GLIBCXX_DEBU
#ifdef _MY_DEBUG
#undef endl
#define debug(x) cout << #x << ": " << x << endl
void err() {}
template <class T> void err(const T &t) {
  print(t);
  cout << " ";
}
template <class Head, class... Tail>
void err(const Head &head, const Tail &...tail) {
  print(head);
  putchar(' ');
  out(tail...);
}
#else
#define debug(x)
template <class... T> void err(const T &...) {}
#endif
#pragma endregion

const ll MOD = 1e9 + 7;
const int N = 1100000;

template <ll Modulus> class modint {
  using u64 = ll;

public:
  u64 a;

  constexpr modint(const u64 x = 0) noexcept
      : a(((x % Modulus) + Modulus) % Modulus) {}
  constexpr u64 &value() noexcept { return a; }
  constexpr const u64 &value() const noexcept { return a; }
  constexpr modint operator+(const modint rhs) const noexcept {
    return modint(*this) += rhs;
  }
  constexpr modint operator-(const modint rhs) const noexcept {
    return modint(*this) -= rhs;
  }
  constexpr modint operator*(const modint rhs) const noexcept {
    return modint(*this) *= rhs;
  }
  constexpr modint operator/(const modint rhs) const noexcept {
    return modint(*this) /= rhs;
  }
  constexpr modint &operator+=(const modint rhs) noexcept {
    a += rhs.a;
    if (a >= Modulus) {
      a -= Modulus;
    }
    return *this;
  }
  constexpr modint &operator-=(const modint rhs) noexcept {
    if (a < rhs.a) {
      a += Modulus;
    }
    a -= rhs.a;
    return *this;
  }
  constexpr modint &operator*=(const modint rhs) noexcept {
    a = a * rhs.a % Modulus;
    return *this;
  }
  constexpr modint &operator/=(modint rhs) noexcept {
    u64 exp = Modulus - 2;
    while (exp) {
      if (exp % 2) {
        *this *= rhs;
      }
      rhs *= rhs;
      exp /= 2;
    }
    return *this;
  }
};

#define mint modint<MOD>
mint inv[N], comb[N], prd[N], invprd[N];
void calc_inv() {
  inv[1] = 1;
  rep2(i, 2, N - 1) { inv[i] = inv[MOD % i] * (-MOD / i); }
  return;
}
void calc_product() {
  prd[0] = prd[1] = 1;
  invprd[0] = invprd[1] = 1;
  rep2(i, 2, N - 1) {
    prd[i] = prd[i - 1] * i;
    invprd[i] = inv[i] * invprd[i - 1];
  }
  return;
}
mint cmb(int a, int b) {
  if (a < b)
    return 0;
  if (a < 0 || b < 0)
    return 0;
  return {prd[a] * invprd[b] * invprd[a - b]};
}
mint modpow(mint x, ll n) {
  if (n == 0)
    return 1;
  mint res = modpow(x * x, n / 2);
  if (n & 1)
    res = res * x;
  return res;
}
void calc() {
  calc_inv();
  calc_product();
}
using vmint = vector<mint>;
ostream &operator<<(ostream &os, mint a) {
  os << a.a;
  return os;
}

using V = vector<vmint>;
void merge(V &a, V b) {
  rep3(i, b.size() - 1, 0) {
    int t = b.size() - 1 - i;
    int s = a.size() - 1 - t;
    vmint mem = a[s];
    a[s] = vmint(3);
    rep3(r, 2, 0) rep3(l, 2, 0) { a[s][min(2ll, l + r)] += mem[r] * b[i][l]; }
  }
}
void recalc(V &a, int n) {
  for (int i = a.size() - 1; i != a.size() - n; i--) {
    a[i][0] += a[i][2];
    a[i][2] = 0;
  }
}
vector<vec> g;
vec cnt;
V dfs(int x, int d) {
  V tmp;
  cnt[d]++;
  int ma = 0;
  for (auto e : g[x]) {
    V now = dfs(e, d + 1);
    chmax(ma, (int)min(tmp.size(), now.size()));
    if (now.size() > tmp.size())
      tmp.swap(now);
    merge(tmp, now);
  }
  if (tmp.size())
    recalc(tmp, ma);
  tmp.pb(vmint{1, 1, 0});
  return tmp;
}

signed main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cout << fixed << setprecision(15);
  int n = in();
  cnt.resize(n + 1);
  g.resize(n + 1);
  rep(i, n) { g[in()].pb(i + 1); }
  mint ans;
  auto dp = dfs(0, 0);
  rep3(i, dp.size() - 1, 0) {
    ans += dp[i][1] * modpow(2, n + 1 - cnt[dp.size() - 1 - i]);
  }
  cout << ans << endl;
}


Fixed submission:
#pragma region Macros
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define rep2(i, a, b) for (ll i = a; i <= b; ++i)
#define rep(i, n) for (ll i = 0; i < n; i++)
#define rep3(i, a, b) for (ll i = a; i >= b; i--)
#define pii pair<int, int>
#define pll pair<ll, ll>
#define pq priority_queue
#define pb push_back
#define eb emplace_back
#define vec vector<int>
#define vecll vector<ll>
#define vecpii vector<pii>
#define vecpll vector<pll>
#define vec2(a, b) vector<vec>(a, vec(b))
#define vec2ll(a, b) vector<vecll>(a, vecll(b))
#define vec3(a, b, c) vector<vector<vec>>(a, vec2(b, c))
#define vec3ll(a, b, c) vector<vector<vecll>>(a, vec2ll(b, c))
#define fi first
#define se second
#define endl "\n"
#define all(c) begin(c), end(c)
#define ios ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
#define lb(c, x) distance(c.begin(), lower_bound(all(c), (x)))
#define ub(c, x) distance(c.begin(), upper_bound(all(c), (x)))
using namespace std;
int in() {
  int x;
  cin >> x;
  return x;
}
ll lin() {
  ll x;
  cin >> x;
  return x;
}
string stin() {
  string s;
  cin >> s;
  return s;
}
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
vec iota(int n) {
  vec a(n);
  iota(all(a), 0);
  return a;
}
void print() { putchar(' '); }
void print(bool a) { cout << a; }
void print(int a) { cout << a; }
void print(long long a) { cout << a; }
void print(char a) { cout << a; }
void print(string &a) { cout << a; }
void print(double a) { cout << a; }
template <class T> void print(const vector<T> &);
template <class T, size_t size> void print(const array<T, size> &);
template <class T, class L> void print(const pair<T, L> &p);
template <class T, size_t size> void print(const T (&)[size]);
template <class T> void print(const vector<T> &a) {
  if (a.empty())
    return;
  print(a[0]);
  for (auto i = a.begin(); ++i != a.end();) {
    cout << " ";
    print(*i);
  }
  cout << endl;
}
template <class T> void print(const deque<T> &a) {
  if (a.empty())
    return;
  print(a[0]);
  for (auto i = a.begin(); ++i != a.end();) {
    cout << " ";
    print(*i);
  }
}
template <class T, size_t size> void print(const array<T, size> &a) {
  print(a[0]);
  for (auto i = a.begin(); ++i != a.end();) {
    cout << " ";
    print(*i);
  }
}
template <class T, class L> void print(const pair<T, L> &p) {
  cout << '(';
  print(p.first);
  cout << ",";
  print(p.second);
  cout << ')';
}
template <class T, size_t size> void print(const T (&a)[size]) {
  print(a[0]);
  for (auto i = a; ++i != end(a);) {
    cout << " ";
    print(*i);
  }
}
template <class T> void print(const T &a) { cout << a; }
int out() {
  putchar('\n');
  return 0;
}
template <class T> int out(const T &t) {
  print(t);
  putchar('\n');
  return 0;
}
template <class Head, class... Tail>
int out(const Head &head, const Tail &...tail) {
  print(head);
  putchar(' ');
  out(tail...);
  return 0;
}
ll gcd(ll a, ll b) {
  while (b) {
    ll c = b;
    b = a % b;
    a = c;
  }
  return a;
}
ll lcm(ll a, ll b) {
  if (!a || !b)
    return 0;
  return a * b / gcd(a, b);
}
#define _GLIBCXX_DEBU
#ifdef _MY_DEBUG
#undef endl
#define debug(x) cout << #x << ": " << x << endl
void err() {}
template <class T> void err(const T &t) {
  print(t);
  cout << " ";
}
template <class Head, class... Tail>
void err(const Head &head, const Tail &...tail) {
  print(head);
  putchar(' ');
  out(tail...);
}
#else
#define debug(x)
template <class... T> void err(const T &...) {}
#endif
#pragma endregion

const ll MOD = 1e9 + 7;
const int N = 1100000;

template <ll Modulus> class modint {
  using u64 = ll;

public:
  u64 a;

  constexpr modint(const u64 x = 0) noexcept
      : a(((x % Modulus) + Modulus) % Modulus) {}
  constexpr u64 &value() noexcept { return a; }
  constexpr const u64 &value() const noexcept { return a; }
  constexpr modint operator+(const modint rhs) const noexcept {
    return modint(*this) += rhs;
  }
  constexpr modint operator-(const modint rhs) const noexcept {
    return modint(*this) -= rhs;
  }
  constexpr modint operator*(const modint rhs) const noexcept {
    return modint(*this) *= rhs;
  }
  constexpr modint operator/(const modint rhs) const noexcept {
    return modint(*this) /= rhs;
  }
  constexpr modint &operator+=(const modint rhs) noexcept {
    a += rhs.a;
    if (a >= Modulus) {
      a -= Modulus;
    }
    return *this;
  }
  constexpr modint &operator-=(const modint rhs) noexcept {
    if (a < rhs.a) {
      a += Modulus;
    }
    a -= rhs.a;
    return *this;
  }
  constexpr modint &operator*=(const modint rhs) noexcept {
    a = a * rhs.a % Modulus;
    return *this;
  }
  constexpr modint &operator/=(modint rhs) noexcept {
    u64 exp = Modulus - 2;
    while (exp) {
      if (exp % 2) {
        *this *= rhs;
      }
      rhs *= rhs;
      exp /= 2;
    }
    return *this;
  }
};

#define mint modint<MOD>
mint inv[N], comb[N], prd[N], invprd[N];
void calc_inv() {
  inv[1] = 1;
  rep2(i, 2, N - 1) { inv[i] = inv[MOD % i] * (-MOD / i); }
  return;
}
void calc_product() {
  prd[0] = prd[1] = 1;
  invprd[0] = invprd[1] = 1;
  rep2(i, 2, N - 1) {
    prd[i] = prd[i - 1] * i;
    invprd[i] = inv[i] * invprd[i - 1];
  }
  return;
}
mint cmb(int a, int b) {
  if (a < b)
    return 0;
  if (a < 0 || b < 0)
    return 0;
  return {prd[a] * invprd[b] * invprd[a - b]};
}
mint modpow(mint x, ll n) {
  if (n == 0)
    return 1;
  mint res = modpow(x * x, n / 2);
  if (n & 1)
    res = res * x;
  return res;
}
void calc() {
  calc_inv();
  calc_product();
}
using vmint = vector<mint>;
ostream &operator<<(ostream &os, mint a) {
  os << a.a;
  return os;
}

using V = vector<vmint>;
void merge(V &a, V b) {
  rep3(i, b.size() - 1, 0) {
    int t = b.size() - 1 - i;
    int s = a.size() - 1 - t;
    vmint mem = a[s];
    a[s] = vmint(3);
    rep3(r, 2, 0) rep3(l, 2, 0) { a[s][min(2ll, l + r)] += mem[r] * b[i][l]; }
  }
}
void recalc(V &a, int n) {
  rep3(i, (int)a.size() - 1, (int)a.size() - n) {
    a[i][0] += a[i][2];
    a[i][2] = 0;
  }
}
vector<vec> g;
vec cnt;
V dfs(int x, int d) {
  V tmp;
  cnt[d]++;
  int ma = 0;
  for (auto e : g[x]) {
    V now = dfs(e, d + 1);
    chmax(ma, (int)min(tmp.size(), now.size()));
    if (now.size() > tmp.size())
      tmp.swap(now);
    merge(tmp, now);
  }
  if (tmp.size())
    recalc(tmp, ma);
  tmp.pb(vmint{1, 1, 0});
  return tmp;
}

signed main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cout << fixed << setprecision(15);
  int n = in();
  cnt.resize(n + 1);
  g.resize(n + 1);
  rep(i, n) { g[in()].pb(i + 1); }
  mint ans;
  auto dp = dfs(0, 0);
  rep3(i, dp.size() - 1, 0) {
    ans += dp[i][1] * modpow(2, n + 1 - cnt[dp.size() - 1 - i]);
  }
  cout << ans << endl;
}