// Original C++ solution (slower):
#include <iostream>

#include <iomanip>

#include <fstream>

#include <sstream>

#include <string>

#include <cmath>

#include <cstdio>

#include <cctype>

#include <ctime>

#include <cstdlib>

#include <cstring>

#include <cassert>

#include <cctype>

#include <cerrno>

#include <cfloat>

#include <ciso646>

#include <climits>

#include <clocale>

#include <complex>

#include <csetjmp>

#include <csignal>

#include <cstdarg>

#include <cstddef>

#include <cwchar>

#include <cwctype>

#include <exception>

#include <locale>

#include <numeric>

#include <new>

#include <stdexcept>

#include <limits>

#include <valarray>

#include <set>

#include <vector>

#include <stack>

#include <queue>

#include <deque>

#include <map>

#include <list>

#include <utility>

#include <bitset>

#include <algorithm>

#include <functional>

#define rep(i, n) for(int i = 0; i < (int)(n); i ++)

#define rep1(i, n) for(int i = 1; i <= (int)(n); i ++)

#define MP make_pair

using namespace std;

typedef long long LL;

typedef pair<int, int> PII;

const int INF = 1e9 + 7;



int n, per[200005];

bool rv[200005], alo[200005];



bool check(int num) 

{

	rep(i, n) rv[i] = per[i] > num;

	rep(i, n) alo[i] = (i == 0 || rv[i] != rv[i - 1]) && (i == n - 1 || rv[i] != rv[i + 1]);

	

	vector<int> vec;

	vec.push_back(1);

	for(int i = 1; i < n; i ++) if(alo[i] == alo[i - 1]) vec.back() ++;

	else {

		vec.back() *= alo[i - 1] ? -1 : 1;

		vec.push_back(1);

	}

	vec.back() *= alo[n - 1] ? -1 : 1;

	

	if(vec.size() == 1) {

		if(vec[0] < 0 && (n >> 1) & 1)

		rep(i, n) rv[i] ^= 1;

	} else {

		int pos = 0;

		rep(i, vec.size()) {

			if(vec[i] < 0) {

				bool ll = i == 0 ? rv[pos - vec[i]] : rv[pos - 1];

				bool rl = i == vec.size() - 1 ? rv[pos - 1] : rv[pos - vec[i]];

				rep(j, -vec[i]) rv[pos ++] = j < ((-vec[i]) >> 1) ? ll : rl;

			} else pos += vec[i];

		}

	}

	return rv[n >> 1];

}



int main()

{

	scanf("%d", &n);

	n = (n << 1) - 1;

	rep(i, n) scanf("%d", &per[i]);

	int l = 0, r = n;

	while(l < r) {

		int mid = (l + r) >> 1;

		if(check(mid)) l = mid + 1;

		else r = mid;

	}

	printf("%d\n", r);

	return 0;

}

// Optimized solution to the same problem (faster):
/*

#include<bits/stdc++.h>

#define rep(i,a,b) for(int i=a;i<=b;i++)

#define ll long long

#define midl (l+r)>>1 

const int maxn=1e6+7;

using namespace std;

int n,l,r,mid,arc[maxn];

bool check(int pp)

{

	if (arc[n]<=pp&&arc[n+1]<=pp) return 1;

	if (arc[n]<=pp&&arc[n-1]<=pp) return 1;

	if (arc[n]>pp&&arc[n+1]>pp) return 0;

	if (arc[n]>pp&&arc[n-1]>pp) return 0;

	rep(i,1,n) 

	 {

	 	if (arc[n+i]<=pp&&arc[n+i+1]<=pp) return 1;

	    if (arc[n-i]<=pp&&arc[n-i-1]<=pp) return 1;

     	if (arc[n+i]>pp&&arc[n+i+1]>pp) return 0;

    	if (arc[n-i]>pp&&arc[n-i-1]>pp) return 0;

	 }

}

int main(){

	scanf("%d",&n);

	rep(i,1,(n<<1)-1) 

	 scanf("%d",&arc[i]);

	for (r=(n<<1)-1,mid=l+r>>1;l<r;mid=l+r>>1)//while(l<r) 

	 if (check(mid)==1) r=mid;

	 else l=mid+1;

	cout<<l;

	return 0;

}

*/

#include<stdio.h>

#define dn(i,j) (a[i]<=k && a[j]<=k)

#define up(i,j) (k<a[i] && k<a[j])



int a[200005],n,l,r,mid;



inline bool judge(const int &k)

{

    if (dn(n-1,n) || dn(n,n+1)) return 1;

    if (up(n-1,n) || up(n,n+1)) return 0;

    for (int i=1;i<n-1;i++)

    {

        if (dn(n+i,n+i+1) || dn(n-i,n-i-1)) return 1;

        if (up(n+i,n+i+1) || up(n-i,n-i-1)) return 0;

    }

    return dn(1,1);

}



int main()

{

    scanf("%d",&n);

    for (int i=1;i<n<<1;i++) scanf("%d",a+i);

    for (r=(n<<1)-1,mid=l+r>>1;l<r;mid=l+r>>1) if (judge(mid)) r=mid;else l=mid+1;

    printf("%d",l);

}

// Fastest known solution for this problem: