#include using namespace std; typedef unsigned long long ll; typedef vector vi; typedef vector vl; typedef complex P; typedef pair pii; #define REP(i,n) for(ll i=0;i>n>>x; vl a(n); REP(i,n)cin>>a[i]; // 先頭20個を別扱いにする解法 vl b = a; sort(ALL(b),greater()); vl c,d; ll dsz = min(20,n); ll csz = n-dsz; REP(i,dsz)d.push_back(b[i]); FOR(i,dsz,n)c.push_back(b[i]); // ナップサック ll cmax = 0; REP(i,csz)cmax += c[i]; cmax = min(cmax,x); vector< vector > dp(csz+1,vector(cmax+1,false)); vector< vector > pred(csz+1,vector(cmax+1,false)); dp[0][0] = true; REP(i,csz){ ll cost = c[i]; REP(p,cmax+1){ if(!dp[i][p])continue; dp[i+1][p] = true; pred[i+1][p] = false; if(p+cost<=cmax){ dp[i+1][p+cost] = true; pred[i+1][p+cost] = true; } } } // 大きい値の全探索 map XS; REP(mask,1<>i&1) s+=d[i]; if(s>x)continue; XS[s] = mask; } // 合体 ll ansid = -1; REP(i,cmax+1){ if(dp[csz][i]&&XS.count(x-i)){ ansid = i; break; } } if(ansid==-1){ cout << "No" << endl; return 0; } // 復元 multiset result; // ここに使う値をぶっこんでいく // dp,predから ll cst = ansid; REP(_i,csz){ ll i = csz-_i; if(pred[i][cst]){ result.insert(c[i-1]); cst -= c[i-1]; } } assert(cst==0); // 全探索のmaskから ll mask = XS[x-ansid]; REP(i,dsz){ if(mask>>i&1)result.insert(d[i]); } // 出力 multiset::iterator iter; REP(i,n){ iter = result.find(a[i]); if(iter!=result.end()){ cout<<"o"; result.erase(iter); }else{ cout<<"x"; } } cout<