#include <bits/stdc++.h>

#define mp make_pair
#define mt make_tuple
#define fi first
#define se second
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define forn(i, n) for (int i = 0; i < (int)(n); ++i)
#define for1(i, n) for (int i = 1; i <= (int)(n); ++i)
#define ford(i, n) for (int i = (int)(n) - 1; i >= 0; --i)
#define fore(i, a, b) for (int i = (int)(a); i <= (int)(b); ++i)

using namespace std;

typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<pii> vpi;
typedef vector<vi> vvi;
typedef long long i64;
typedef vector<i64> vi64;
typedef vector<vi64> vvi64;
typedef pair<i64, i64> pi64;
typedef double ld;

template<class T> bool uin(T &a, T b) { return a > b ? (a = b, true) : false; }
template<class T> bool uax(T &a, T b) { return a < b ? (a = b, true) : false; }

const int maxn = 1 << 18;
const i64 P = 1000000000 + 7;

i64 deg(i64 x, i64 d) {
    if (d < 0) d += P - 1;
    i64 y = 1;
    while (d) {
        if (d & 1) (y *= x) %= P;
        d /= 2;
        (x *= x) %= P;
    }
    return y;
}

int perm[maxn];
i64 path[maxn], lcac[maxn];

int h, off;

pi64 operator+(pi64 a, pi64 b) {
    return {(a.fi + b.fi) % P, (a.se + b.se) % P};
}

pi64 operator-(pi64 a, pi64 b) {
    return {(a.fi - b.fi) % P, (a.se - b.se) % P};
}

pi64 operator*(pi64 a, i64 t) {
    return {a.fi * t % P, a.se * t % P};
}

i64 cross(pi64 a, pi64 b) {
    return (a.fi * b.se + a.se * b.fi) % P;
}

int len(int u) {
    return 32 - __builtin_clz(u);
}

int lca(int u, int v) {
    int ub = min(len(u), len(v));
//    cerr << u << ' ' << v << " -> ";
    u <<= 31 - len(u);
    v <<= 31 - len(v);
    int com = __builtin_clz(u ^ v) - 1;
    uin(com, ub);
//    cerr << (u >> (len(u) - com)) << '\n';
    return u >> (len(u) - com);
}

i64 solve(int i, int b) {
    if (b == 0) return 0;
    vector<pair<int, pi64> > a(1 << b);
    forn(j, 1 << b) {
        pi64 w;
        (j < (1 << (b - 1)) ? w.fi : w.se) = path[off + i + j] * path[off + perm[i + j]] % P;
        a[j] = mp(perm[i + j] + off, w);
    }
    sort(all(a));
    pi64 sum;
    i64 res = 0;
    vector<pair<int, pi64> > anc;
    for (auto w: a) {
        int v = w.fi;
        pi64 z = w.se;
//        cerr << i << ' ' << b << ' ' << v << ' ' << z.fi << ' ' << z.se << ' ' << sum.fi << ' ' << sum.se << ' ' << res << '\n';
        vector<pair<int, pi64> > st;
        while (!anc.empty()) {
            int u = anc.back().fi;
            pi64 w = anc.back().se;
            int l = lca(u, v);
            if (l == u) break;
            sum = sum + w * (lcac[l] - lcac[u]);
            st.pb(mp(l, w));
            anc.pop_back();
        }
        while (!st.empty()) {
            if (anc.empty() || st.back().fi != anc.back().fi) anc.pb(st.back());
            else anc.back().se = anc.back().se + st.back().se;
            st.pop_back();
        }
        res = (res + cross(z, sum)) % P;
        anc.pb(mp(v, z));
        sum = sum + z * lcac[v];
    }
//    cerr << i << ' ' << b << " = " << t << '\n';
    int root = (i + off) >> b;
//    cerr << root << '\n';
    return (res * lcac[root] + solve(i, b - 1) + solve(i + (1 << (b - 1)), b - 1)) % P;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.precision(10);
    cout << fixed;
#ifdef LOCAL_DEFINE
    freopen("input.txt", "rt", stdin);
#endif

    cin >> h;
    off = 1 << (h - 1);
    forn(i, 1 << (h - 1)) {
        cin >> perm[i];
        --perm[i];
    }

    int n = (1 << h) - 1;
    path[1] = 1;
    lcac[1] = 1;
    fore(i, 2, n) {
        path[i] = path[i / 2] * i % P;
        lcac[i] = lcac[i / 2] * deg(1LL * i * (i / 2) % P, -1) % P;
    }

    i64 ans = solve(0, h - 1);
    if (ans < 0) ans += P;
    cout << ans << '\n';

#ifdef LOCAL_DEFINE
    cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
#endif
    return 0;
}


Measured memory_bytes: 14020