#include<bits/stdc++.h>
#define pb push_back
#define pii pair<int,int>
#define mp make_pair
using namespace std;
const int N=1e6+50,mod=1e9+7;
int h,lim,p[N],cnt,dat[N],inv[N],idat[N],sum[N],ans;
vector<pii>v[N];
int read(){
    int x=0,c;
    while(!isdigit(c=getchar()));
    while(isdigit(c))x=x*10+c-48,c=getchar();
    return x;
}
int main(){
    scanf("%d",&h);lim=1<<h;cnt=lim>>1;
    inv[1]=1;
    for(int i=2;i<lim;i++)
        inv[i]=mod-1ll*mod/i*inv[mod%i]%mod;
    for(int i=cnt,x;i<lim;i++)v[i].pb(mp(i,read()+cnt-1));
    dat[1]=idat[1]=1;
    for(int i=2;i<lim;i++)
        dat[i]=1ll*dat[i>>1]*i%mod,
        idat[i]=1ll*idat[i>>1]*inv[i]%mod;
    for(int i=1;i<lim;i++)idat[i]=1ll*i*idat[i]%mod*idat[i]%mod;
    for(int i=cnt-1;i;i--){
        v[i]=v[i<<1];
        for(int j=0;j<v[i<<1|1].size();j++)
            v[i].pb(v[i<<1|1][j]);
    }
    for(int i=1;i<cnt;i++){
        for(int j=0;j<v[i<<1].size();j++){
            int x=v[i<<1][j].first,y=v[i<<1][j].second,yy=y;
            while(y)sum[y]=(sum[y]+1ll*dat[x]*idat[i]%mod*dat[yy])%mod,y>>=1;
        }
        for(int j=0;j<v[i<<1|1].size();j++){
            int x=v[i<<1|1][j].first,y=v[i<<1|1][j].second,yy=y;
            int tmp=0;
            while(y)tmp=(tmp+1ll*sum[y]*(idat[y]-idat[y>>1]))%mod,y>>=1;
            ans=(ans+1ll*tmp*dat[yy]%mod*dat[x])%mod;
        }
        for(int j=0;j<v[i<<1].size();j++){
            int y=v[i<<1][j].second;while(y)sum[y]=0,y>>=1;
        }
    }
    cout<<ans;
    return 0;
}
