Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- bool del[200005];
- vector<int> v[200005];
- int par[200005],sz[200005],dep[200005],depx;
- void pre(int node,int p)
- {
- for (int u:v[node])
- {
- if (u!=p)
- {
- par[u]=node;
- dep[u]=dep[node]+1;
- pre(u,node);
- }
- }
- }
- vector<int> h;
- int query(char c,int u)
- {
- printf("%c %d\n",c,u);
- fflush(stdout);
- int ans;
- scanf("%d",&ans);
- return ans;
- }
- int getsz(int node,int p)
- {
- sz[node]=1;
- for (int u:v[node])
- {
- if (!del[u] && u!=p)
- sz[node]+=getsz(u,node);
- }
- return sz[node];
- }
- int find(int node,int p,int nn)
- {
- for (int u:v[node])
- {
- if (!del[u] && u!=p && sz[u]>nn/2)
- return find(u,node,nn);
- }
- return node;
- }
- int dfs(int node)
- {
- getsz(node,0);
- int c=find(node,0,sz[node]),d=query('d',c);
- if (!d)
- return c;
- del[c]=1;
- if (dep[c]+d==depx)
- return dfs(query('s',c));
- return dfs(par[c]);
- }
- int main()
- {
- int n;
- scanf("%d",&n);
- for (int i=1;i<n;i++)
- {
- int a,b;
- scanf("%d%d",&a,&b);
- v[a].push_back(b);
- v[b].push_back(a);
- }
- depx=query('d',1);
- pre(1,0);
- printf("! %d\n",dfs(1));
- fflush(stdout);
- }
Add Comment
Please, Sign In to add comment