求大佬帮忙优化
#include <cstdio>
#include <ctype.h>
#define il inline
#define ri register int
using namespace std;
const int N=2e5+5;
int to[N<<1],nxt[N<<1],h[N],cnt;
int n,dep[N],mxd[N],depx,deplca,fa[N][20],now;
il int read(){
int x(0);
char ch(getchar());
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)){
x=(x<<3)+(x<<1)+(ch&15);
ch=getchar();
}
return x;
}
il void add(int u,int v){
to[++cnt]=v,nxt[cnt]=h[u],h[u]=cnt;
}
il void dfs(int u,int f){
dep[u]=dep[f]+1;
fa[u][0]=f,mxd[u]=u;
for(ri i=1;i<=18;++i) fa[u][i]=fa[fa[u][i-1]][i-1];
for(ri i=h[u];i;i=nxt[i]){
int v=to[i];
if(v!=f){
dfs(v,u);
if(dep[mxd[u]]<dep[mxd[v]]) mxd[u]=mxd[v];
}
}
}
int main(){
n=read();
for(ri i=1,u,v;i<n;++i){
u=read(),v=read();
add(u,v);
add(v,u);
}
dfs(1,0);
printf("d 1\n");
fflush(stdout);
depx=read();
if(!depx) return printf("! 1"),0;
++depx,now=1;
while(1){
printf("d %d\n",mxd[now]);
fflush(stdout);
deplca=read();
if(deplca==0) return printf("! %d",mxd[now]),0;
deplca=(depx+dep[mxd[now]]-deplca)/2;
int u=mxd[now];
for(ri i=18;i>=0;--i) if(dep[fa[u][i]]>=deplca) u=fa[u][i];
if(dep[u]==depx) return printf("! %d",u),0;
printf("s %d\n",u);
fflush(stdout);
now=read();
if(dep[now]==depx) return printf("! %d",now),0;
}
return 0;
}