#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 5;
struct node {
int l, r, val;
}k[N * 22];
int n, cnt, tot, rt;
int dfs () {
int a, x; cin >> a; k[x = ++ tot].val = a;
if (a != 0) cnt ++;
else { k[x].l = dfs (); k[x].r = dfs (); }
return x;
}
void OutPut (int x) {
if (!x) return;
cout << k[x].val << "\n";
OutPut (k[x].l); OutPut (k[x].r);
}
struct point {
int l, r, val;
}t[N * 10];
int root[N * 10], num;
inline void pushup (int cur) {
t[cur].val = t[t[cur].l].val + t[t[cur].r].val;
}
void insert (int &cur, int l, int r, int x, int val) {
if (!cur) cur = ++ num;
if (l == r) return t[cur].val += val, void();
int mid = l + r >> 1;
if (x <= mid) insert (t[cur].l, l, mid, x, val);
else insert (t[cur].r, mid + 1, r, x, val);
pushup (cur);
}
int Delta = 0, Ans, Delta2;
void merge (int &cur, int cur2, int l, int r) {
if (!cur or !cur2) return cur = cur + cur2, void ();
if (l == r) return t[cur].val += t[cur2].val, void();
int mid = l + r >> 1;
Delta += t[t[cur].l].val * t[t[cur2].r].val;
Delta2 += t[t[cur].r].val * t[t[cur2].l].val;
merge (t[cur].l, t[cur2].l, l, mid); merge (t[cur].r, t[cur2].r, mid + 1, r);
pushup (cur);
}
void DFS (int x) {
if (k[x].val != 0) return insert (root[x], 1, n, k[x].val, 1), void ();
DFS (k[x].l), DFS (k[x].r);
Delta2 = Delta = 0;
merge (root[k[x].l], root[k[x].r], 1, n);
root[x] = root[k[x].l];
Ans += min (Delta, Delta2);
}
signed main () {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n;
rt = dfs ();
DFS (rt);
cout << Ans << "\n";
}