#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;
}