rt,思路大概就是建一棵树(我好菜啊)
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 1;
int m, q, l;
string tmp;
struct node
{
int p;
int f;/*-1:结束 0:< 1:> */
}s[N];
void work(int l, int x)
{
int j = l + 1;
if(tmp[l] == '>')
{
s[x].f = 1;
}
else
{
s[x].f = 0;
}
int c = 0;
while(tmp[j] >= '0' && tmp[j] <= '9')
{
c = c * 10 + (tmp[j] - '0');
j++;
}
s[x].p = c;
int yyy = j + 1;
if(tmp[yyy] == 'x')
{
work(yyy + 1, x * 2);
}
else
{
j = yyy;
c = 0;
while(tmp[j] >= '0' && tmp[j] <= '9')
{
c = c * 10 + (tmp[j] - '0');
j++;
}
s[x * 2].p = c;
s[x * 2].f = -1;
}
int wsum = 1;
while(wsum)
{
if(tmp[yyy] == '?')
{
wsum++;
}
else if(tmp[yyy] == ':')
{
wsum--;
}
yyy++;
}
j = yyy;
if(tmp[j] == 'x')
{
work(j + 1, x * 2 + 1);
}
else
{
c = 0;
while(tmp[j] >= '0' && tmp[j] <= '9')
{
c = c * 10 + (tmp[j] - '0');
j++;
}
s[x * 2 + 1].p = c;
s[x * 2 + 1].f = -1;
}
return;
}
signed main()
{
cin >> m >> q;
cin >> tmp;
work(1, 1);
while(q--)
{
int i = 1, x;
cin >> x;
while(s[i].f != -1)
{
if(s[i].f == 0)
{
if(x < s[i].p)
{
i *= 2;
}
else
{
i *= 2, i++;
}
}
else
{
if(x > s[i].p)
{
i *= 2;
}
else
{
i *= 2, i++;
}
}
}
cout << s[i].p << "\n";
}
return 0;
}