rt,dfsgr和dfs函数太低效。求优化。
#include<bits/stdc++.h>
#define rep(i,l,r) for(int i=(l);i<=(r);i++)
#define per(i,l,r) for(int i=(r);i>=(l);i--)
using namespace std;
const int N=1e6+10;
struct node{
char k;
int da,l,r;
}t[N];
int n,m,q,cnt=1;
string s;
inline int finds(int l,int r){
int tp=1;
rep(i,l,r){
if(s[i]=='?'){
tp++;
}else if(s[i]==':'){
if(--tp==0){
return i;
}
}
}
return -1;
}
inline void dfsgr(int u,int l,int r){
int uda=0,udf=1;
rep(i,l,r){
if(s[i]>='0'&&s[i]<='9'){
uda=uda*10+s[i]-'0';
}else{
udf=0;
break;
}
}
if(udf){
t[u].da=uda;
return ;
}
t[u].k=s[l+1];
int tp=0;
rep(i,l+2,r){
if(s[i]>='0'&&s[i]<='9'){
t[u].da=t[u].da*10+s[i]-'0';
}else{
tp=i+1;
break;
}
}
int pos=finds(tp,r);
t[u].l=++cnt;
dfsgr(cnt,tp,pos-1);
t[u].r=++cnt;
dfsgr(cnt,pos+1,r);
}
int dfs(int u,int x){
if(!t[u].k){
return t[u].da;
}
if(t[u].k=='>'){
if(x>t[u].da){
return dfs(t[u].l,x);
}else{
return dfs(t[u].r,x);
}
}else{
if(x<t[u].da){
return dfs(t[u].l,x);
}else{
return dfs(t[u].r,x);
}
}
}
int main(){
//freopen("xx.in","r",stdin);
//freopen("xx.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>m>>q>>s;
n=s.size();
s=" "+s;
dfsgr(1,1,n);
while(q--){
int x;
cin>>x;
cout<<dfs(1,x)<<"\n";
}
return 0;
}