#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define mp make_pair
#define FI first
#define SE second
#define maxn (1<<18)
#define mod 1000000007
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef double db;

int dep[maxn+5];
int per[maxn+5];
ll sum[maxn+5];

int main()
{
    int H; scanf("%d",&H);
    int n=1<<(H-1),base=n-1;
    rep(i,1,base+n) dep[i]=dep[i/2]+1;
    rep(i,1,n) scanf("%d",&per[base+i]),per[base+i]+=base;
    ll ans=0;
    rep(now,1,base)
    {
        //int ls=now*2,rs=now*2+1;
        int N=1<<(H-dep[now]-1);
        int L=now<<(H-dep[now]),R=L+N;
        rep(x,L,L+N-1)
        {
            ll mul=1;
            int tmp=x;
            while(tmp>=now)
            {
                mul=mul*tmp%mod;
                tmp>>=1;
            }
            int y=per[x];
            while(y)
            {
                mul=mul*y%mod;
                sum[y]=(sum[y]+mul)%mod;
                //printf("?? %d, %d: %lld\n",x,y,mul);
                y>>=1;
            }
        }
        rep(x,R,R+N-1)
        {
            ll mul=1;
            int tmp=x;
            while(tmp>now)
            {
                mul=mul*tmp%mod;
                tmp>>=1;
            }
            int y=per[x];
            while(y>1)
            {
                //printf("-- %d, %d: %lld, %lld\n",x,y,mul,sum[y]*mul%mod);
                mul=mul*y%mod;
                ans=(ans+(sum[y/2]-sum[y]*(y/2)%mod+mod)*mul)%mod;
                y>>=1;
            }
        }
        rep(x,L,L+N-1)
        {
            int y=per[x];
            while(y)
            {
                sum[y]=0;
                y>>=1;
            }
        }
    }
    printf("%lld\n",ans);
    return 0;
}