//#pragma GCC optimize("O3") #include using namespace std; #define ll long long #define rep(i,n) for (ll i=0;i<(ll)n;i++) #define rrep(i,n) for (ll i=(n)-1;i>=(ll)0;i--) #define loop(i,m,n) for(ll i=m;i<=(ll)n;i++) #define rloop(i,m,n) for(ll i=m;i>=(ll)n;i--) #define vl vector #define vvl vector> #define vdbg(a) rep(ii,a.size()){cout< //#define bbi boost::multiprecision::cpp_int //#include //整数同士の累乗の計算をする。 ll power(ll A, ll B) { ll result = 1; for (ll i=0;i struct SegTree{ ll size; ll tall; vector data; function p; //セグ木に乗せる値の初期値をa配列にし、putの関数をセグ木に乗せる、dをデフォルト値に。 SegTree(vector a,function put,T d) : data(power(2,logax(2,a.size())+1)) { size = data.size()/2; tall=logax(2,size)+1; p=put; ll tmp=size; data = vector(size*2,d); while(tmp!=0){ if(tmp==size)rep(i,a.size())data[tmp+i]=a[i]; else rep(i,tmp) data[tmp+i]=p(data[2*(tmp+i)],data[2*(tmp+i)+1]); tmp/=2; } } //更新、t番目の値をxにする。 void update(ll t,T x){ t+=size; while(t!=0){ if(t>=size)data[t]=x; else data[t]=p(data[2*t],data[2*t+1]); t/=2; } } //取得、l~r区間内の評価値を取得する。 T get(ll l,ll r){ //lとrが範囲外なら範囲内に正す l=max(0LL,l); r=min(r,size-1); r++; T ans=data[0]; ll pos=l+size; ll wid=1; //出来る限り上に上げきる。 while(l+(wid*2)<=r){ while(l%(wid*2)==0&&l+(wid*2)<=r)pos/=2,wid*=2; ans=p(ans,data[pos]); pos++; l+=wid; } //上げ終わったので今度は下げる while(l!=r){ while(l+wid>r)pos*=2,wid/=2; ans=p(ans,data[pos]); pos++; l+=wid; } return ans; } }; ll n; map cash; bool query(vl a){ if(a.size()>n)return false; if(cash.count(a))return cash[a]; cout<<"? "<>ans; bool tmp; if(ans=="Yes")tmp=true; else tmp=false; cash[a]=tmp; return cash[a]; } //メイン int main(){ cin>>n; priority_queue> list; loop(i,1,n){ ll tmp=0; rep(j,inf){ vl q(tmp+1,i); if(!query(q))break; tmp++; } vl vt; rep(j,tmp)vt.push_back(i); list.push({-tmp,vt}); } while(list.top().first==0)list.pop(); while(list.size()>1){ vl a=list.top().second; list.pop(); vl b=list.top().second; list.pop(); vl ans=b; ll index=0; rep(i,b.size()){ while(index!=a.size()){ ans.insert(ans.begin()+i+index,a[index]); if(query(ans)){ index++; }else{ ans.erase(ans.begin()+i+index); break; } } } while(index