#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5, M = 1e7 + 5;
string s;
int m, q, x;
stack<int> stk;
stack<int> stk1;
int mark[N], mk1[N];
struct node
{
int f, nbr;
int ll, lr;
int rl, rr;
};
map<pair<int, int>, node> tree;
void build(int l, int r)
{
int sum = 0;
int p_re = 0;
int flag = -1;
for (int i = l; i <= r; i++)
{
if (s[i] == '>' || s[i] == '<')
{
if (s[i] == '>') flag = 1;
else flag = 2;
p_re = i;
break;
}
if (s[i] >= '0' && s[i] <= '9') sum = sum * 10 + (s[i] - '0');
}
cout << l << " " << r << " " << sum << " " << flag << "\n";
tree[make_pair(l, r)].f = flag;
if (flag == -1)
{
tree[make_pair(l, r)].nbr = sum;
return ;
}
int sum1 = 0;
for (int i = p_re + 1; i < mk1[p_re]; i++) sum1 = sum1 * 10 + (s[i] - '0');
tree[make_pair(l, r)].nbr = sum1;
int ll = tree[make_pair(l, r)].ll = mk1[p_re] + 1;
int lr = tree[make_pair(l, r)].lr = mark[mk1[p_re]] - 1;
int rl = tree[make_pair(l, r)].rl = mark[mk1[p_re]] + 1;
int rr = tree[make_pair(l, r)].rr = r;
build(ll, lr);
build(rl, rr);
return ;
}
int query(int l, int r, int num)
{
if (tree[make_pair(l, r)].f == -1)
return tree[make_pair(l, r)].nbr;
if (tree[make_pair(l, r)].f == 1)
{
if (num > tree[make_pair(l, r)].nbr)
return query(tree[make_pair(l, r)].ll, tree[make_pair(l, r)].lr, num);
return query(tree[make_pair(l, r)].rl, tree[make_pair(l, r)].rr, num);
}
if (tree[make_pair(l, r)].f == 2)
{
if (num < tree[make_pair(l, r)].nbr)
return query(tree[make_pair(l, r)].ll, tree[make_pair(l, r)].lr, num);
return query(tree[make_pair(l, r)].rl, tree[make_pair(l, r)].rr, num);
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> m >> q >> s;
int n = s.size();
s = "#" + s;
for (int i = 1; i <= n; i++)
{
if (s[i] == '<' || s[i] == '>')
stk1.push(i);
if (s[i] == '?')
{
int cur = stk1.top();
mk1[cur] = i;
stk1.pop();
stk.push(i);
}
else if (s[i] == ':')
{
int cur = stk.top();
mark[cur] = i;
stk.pop();
}
}
build(1, n);
while (q--)
{
cin >> x;
cout << query(1, n, x) << "\n";
}
return 0;
}