#include<iostream>
#define DIM (1 << 18 + 5)
#define mod 1000000007
using namespace std;
int n, k, i, sol;
int p[DIM], d[DIM];
void solve(int nod, int prod){
    prod = prod * 1LL * nod % mod;
    if(nod < k){
        solve(2 * nod, prod);
        solve(2 * nod + 1, prod);
        return;
    }
    int u, prod2, sum;
    prod2 = prod;
    for(u = p[nod]; u != 1; u /= 2){
        prod2 = prod2 * 1LL * u % mod;
        sum = d[u / 2] - d[u] * 1LL * (u / 2) % mod;
        if(sum < 0){
            sum += mod;
        }
        sol = (sol + sum * 1LL * prod2) % mod;
    }
}
void clean(int nod){
    if(nod < k){
        clean(2 * nod);
        clean(2 * nod + 1);
    }
    else{
        for(int u = p[nod]; u != 0; u /= 2){
            d[u] = 0;
        }
    }
}
void calc(int nod, int prod){
    prod = prod * 1LL * nod % mod;
    if(nod < k){
        calc(2 * nod, prod);
        calc(2 * nod + 1, prod);
        return;
    }
    for(int u = p[nod]; u != 0; u = u / 2){
        prod = prod * 1LL * u % mod;
        d[u] = (d[u] + prod) % mod;
    }
}
int main(){
    cin>> n;
    k = (1 << (n - 1) );
    for(i = k; i < 2 * k; i++){
        cin>> p[i];
        p[i] = p[i] + k - 1;
    }
    for(i = 1; i < k; i++){
        calc(2 * i, i);
        solve(2 * i + 1, 1);
        clean(2 * i);
    }
    cout<< sol;
}
