#include <bits/stdc++.h>
typedef long long LL;
const int MAXN = 1 << 18 | 1, MOD = 1e9 + 7;
inline int add(int x, int y) { return x + y >= MOD ? x + y - MOD : x + y; }
inline int sub(int x, int y) { return x < y ? x - y + MOD : x - y; }
inline int mul(int x, int y) { return 1LL * x * y - 1LL * x * y / MOD * MOD; }
inline int Qpow(int a, int b) { int ans = 1; for (; b; a = mul(a, a), b >>= 1) if (b & 1) ans = mul(ans, a); return ans; }
int n, l, h, ans;
int p[MAXN], val[MAXN];
template <int N, int S>
struct Trie {
int QAQ[N];
inline void insert(int x, int val) { for (; x > 1; x >>= 1) val = mul(val, x), QAQ[x] = add(QAQ[x], val); }
inline int query(int x) {
int ans = 0, pro = 1;
for (; x > 1; x >>= 1) pro = mul(pro, x), ans = add(ans, mul(mul(QAQ[x ^ 1], pro), x >> 1));
return ans;
}
};
Trie <MAXN, 2> T;
void gao(int x, int L, int R) {
if (L < R) {
int mid = (L + R) >> 1;
gao(x << 1, L, mid), gao(x << 1 | 1, mid + 1, R);
for (int i = L; i <= mid; ++i) T.insert(p[i] + l - 1, val[i]);
for (int i = mid + 1; i <= R; ++i) ans = add(ans, mul(mul(x, val[i]), T.query(p[i] + l - 1)));
for (int i = L; i <= mid; ++i) T.insert(p[i] + l - 1, MOD - val[i]);
}
for (int i = L; i <= R; ++i) val[i] = mul(val[i], x);
}
int main() {
scanf("%d", &h), n = (1 << h) - 1, l = 1 << (h - 1);
for (int i = 1; i <= l; ++i) scanf("%d", p + i);
for (int i = 1; i <= l; ++i) val[i] = 1;
gao(1, 1, l);
printf("%d\n", ans);
return 0;
}