#include #include #include #include #include using namespace std; int main(){ int n; cin>>n; vector>g(n); vector>edge(n-1); for(int i=0;i>u>>v; u--,v--; edge[i]={u,v}; g[u].push_back(v); g[v].push_back(u); } vectordst(n,1e9); dst[0]=0; queueque; que.push(0); while(!que.empty()){ int x=que.front(); que.pop(); for(int i:g[x]){ if(dst[i]>dst[x]+1){ dst[i]=dst[x]+1; que.push(i); } } } auto query=[&](vectorx)->bool { cout<<"?"; for(int i:x)cout<<' '<>res; assert(res!="Invalid"); return res=="Yes"; }; vectorL,R; auto contain_L=[&]()->bool { vectors(n,-1); for(int l:L)s[l]=0; for(int r:R)s[r]=1; vectorx(n-1); for(int i=0;i1){ R.clear(); int sz=ssize(L); R=vector(L.begin()+sz/2,L.end()); L=vector(L.begin(),L.begin()+sz/2); if(!contain_L())swap(L,R); } cout<<"! "<