using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;
using Pair = System.Collections.Generic.KeyValuePair<int, int>;
class Program
{
public Program() { }
static void Main(string[] args)
{
new Program().prog();
}
Scanner cin;
const int MOD = 1000000007;
const int INF = int.MaxValue - 10;
const long INFL = long.MaxValue - 10;
const double EPS = 1e-7;
const double PI = 3.1415926536;
void prog()
{
cin = new Scanner();
int[,] dir8 = new int[8, 2] { { -1, -1 }, { -1, 0 }, { -1, 1 }, { 0, -1 }, { 0, 1 }, { 1, -1 }, { 1, 0 }, { 1, 1 } };
int[,] dir4 = new int[4, 2] { { -1, 0 }, { 0, -1 }, { 0, 1 }, { 1, 0 } };
int N = cin.nextInt();
int[] A = new int[N];
for (int i = 0; i < N; i++)
{
A[i] = cin.nextInt();
}
string S = cin.next();
int M = S.Length, m = 0;
for (int i = 0; i < S.Length; i++)
{
if (S[i] == 'm')
{
M = i;
m = S.Length - i;
break;
}
}
SegTreeMax sgM = new SegTreeMax(A);
int[] B = new int[N - M];
for (int i = 0; i < N - M; i++)
{
B[i] = sgM.rmq(i, i + M + 1);
//Console.WriteLine(B[i]);
}
//SegTreeMin sgm = new SegTreeMin(B);
Console.WriteLine(B.Min());
}
class SegTreeMin
{
int n; // 葉ノードの数
int[] dat;
// 区間[a,b)の最小値。ノードk=[l,r)に着目している。
public int _rmq(int a, int b, int k, int l, int r)
{
if (r <= a || b <= l) return INF; // 交差しない
if (a <= l && r <= b) return dat[k]; //a,l,r,bの順
else {
int s1 = _rmq(a, b, 2 * k + 1, l, (l + r) / 2);
int s2 = _rmq(a, b, 2 * k + 2, (l + r) / 2, r);
return Math.Min(s1, s2);
}
}
public int rmq(int a, int b)
{
return _rmq(a, b, 0, 0, n);
}
public void update(int k, int x)
{
k += n - 1;
dat[k] = x;
while (k > 0)
{
k = (k - 1) / 2;
dat[k] = Math.Min(dat[2 * k + 1], dat[2 * k + 2]);
}
}
public SegTreeMin(int size)
{
n = 1;
while (n < size) n <<= 1;
dat = new int[n << 1];
}
public SegTreeMin(int[] array)
{
n = 1;
while (n < array.Length) n <<= 1;
dat = new int[2 * n - 1];
for (int i = 0; i < array.Length; i++)
{
dat[i + n - 1] = array[i];
}
for (int i = array.Length; i < n; i++)
{
dat[i + n - 1] = INF;
}
for (int i = n - 2; i >= 0; i--)
{
dat[i] = Math.Min(dat[2 * i + 1], dat[2 * i + 2]);
}
}
}
class SegTreeMax
{
int n; // 葉ノードの数
int[] dat;
// 区間[a,b)の最小値。ノードk=[l,r)に着目している。
public int _rmq(int a, int b, int k, int l, int r)
{
if (r <= a || b <= l) return 0; // 交差しない
if (a <= l && r <= b) return dat[k]; //a,l,r,bの順
else {
int s1 = _rmq(a, b, 2 * k + 1, l, (l + r) / 2);
int s2 = _rmq(a, b, 2 * k + 2, (l + r) / 2, r);
return Math.Max(s1, s2);
}
}
public int rmq(int a, int b)
{
return _rmq(a, b, 0, 0, n);
}
public void update(int k, int x)
{
k += n - 1;
dat[k] = x;
while (k > 0)
{
k = (k - 1) / 2;
dat[k] = Math.Max(dat[2 * k + 1], dat[2 * k + 2]);
}
}
public SegTreeMax(int size)
{
n = 1;
while (n < size) n <<= 1;
dat = new int[n << 1];
}
public SegTreeMax(int[] array)
{
n = 1;
while (n < array.Length) n <<= 1;
dat = new int[2 * n - 1];
for (int i = 0; i < array.Length; i++)
{
dat[i + n - 1] = array[i];
}
for (int i = array.Length; i < n; i++)
{
dat[i + n - 1] = 0;
}
for (int i = n - 2; i >= 0; i--)
{
dat[i] = Math.Max(dat[2 * i + 1], dat[2 * i + 2]);
}
}
}
}
class Scanner
{
string[] s;
int i;
char[] cs = new char[] { ' ' };
public Scanner()
{
s = new string[0];
i = 0;
}
public string next()
{
if (i < s.Length) return s[i++];
string st = Console.ReadLine();
while (st == "") st = Console.ReadLine();
s = st.Split(cs, StringSplitOptions.RemoveEmptyEntries);
i = 0;
return next();
}
public int nextInt()
{
return int.Parse(next());
}
public long nextLong()
{
return long.Parse(next());
}
public double nextDouble()
{
return double.Parse(next());
}
}