#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
template<class T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
template<class A> ostream& operator<<(ostream &cout, vector<A> const &v) {cout << "["; for(int i = 0; i < v.size(); i++) {if (i) cout << ", "; cout << v[i];} return cout << "]";};
template<class A, class B> ostream& operator<<(ostream &cout, const pair<A,B> &x) {return cout << "(" <<x.first << ", " << x.second << ")";};
template<class T> void pv(T a, T b) {cerr << "["; for (T i = a; i != b; ++i) {if (i != a) cerr << ", "; cerr << *i;}cerr << "]\n";}
void _print() {cerr << "]\n";}
template<class T, class... V> void _print(T t, V... v) {cerr << t; if (sizeof...(v)) cerr << ", "; _print(v...);}
#define debug(x...) cerr << "[" << #x << "] = [", _print(x)
#define fi first
#define se second
#define SZ(x) (int)((x).size())
#define pii pair<int,int>
#define uid(x,y) uniform_int_distribution<int>(x,y)(rng)
int a[100005];
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin >> n;
    for (int q = 1; q <= n; q++) cin >> a[q];
    sort(a,a+(n+1));
    ll ans = 1;
    for (int q = 1; q <= n; q++) {
        ans *= (a[q]-a[q-1]+1);
        ans %= 1000000007;
    }
    cout << ans << '\n';
    return 0;
}



#include <bits/stdc++.h> 
using namespace std;
#define     ll              long long
#define     mp              make_pair
#define     rep(i,a,b)      for( i=a;i<b;++i)
#define     repr(i,a,b)     for( i=a;i>=b;i--)
#define     up              upper_bound
#define     lb              lower_bound
#define     t()             int test;cin>>test;while(test--)
#define     IOS             ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

#define TRACE
#ifdef TRACE
#define trace(...) __f(#__VA_ARGS__, __VA_ARGS__)
    template <typename Arg1>
    void __f(const char* name, Arg1&& arg1){
        cout << name << " : " << arg1 << endl;
        //use cerr if u want to display at the bottom
    }
    template <typename Arg1, typename... Args>
    void __f(const char* names, Arg1&& arg1, Args&&... args){
        const char* comma = strchr(names + 1, ','); cout.write(names, comma - names) << " : " << arg1<<" | ";__f(comma+1, args...);
    }
#else
#define trace(...)
#endif

// const ll mod = 1e9 + 7;

// ll nCr(ll n,ll r){
//     ll f[1001] = {0};
//     f[0] = f[1] = 1;
//     for(ll i = 2;i <= n;i++){
//         f[i] = 1;
//         for(ll j = i-1;j >= 1;j--){
//             f[j] = (f[j]+f[j-1])%mod;
//         }
//     }
//     return f[r];
// }

int main()
{  
    #ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    #endif
    IOS;
    ll n;
    cin >> n;
    ll m = (ll)(pow(2,n) + 0.5);
    ll a[m];
    for(ll i = 0;i < m;i++){
        cin >> a[i];
    }
    ll maxi = 0,index = 0;
    vector<pair<ll,ll>> nums;
    for(ll i = 0;i < m/2;i++){
        if(a[i] > maxi){
            maxi = a[i];
            index = i;
        }
    }
    nums.push_back({maxi,index});
    maxi = 0,index = 0;
    for(ll i = m/2;i < m;i++){
        if(a[i] > maxi){
            maxi = a[i];
            index = i;
        }
    }
    nums.push_back({maxi,index});
    if(nums[0].first > nums[1].first){
        cout << nums[1].second + 1 << "\n";
    }else{
        cout << nums[0].second + 1 << "\n";
    }
    return 0;
}
