#include using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, K; cin >> N >> K; string S; cin >> S; // まず括弧列チェック int bal = 0; for (char c : S) { if (c == '(') bal++; else { bal--; if (bal < 0) { cout << "No\n"; return 0; } } } if (bal != 0) { cout << "No\n"; return 0; } string ans; ans.reserve(4LL * K + 2LL * N); // st.back() = 現在開いている括弧の「中に存在する項数」 vector st; int top_terms = 0; // 最上位(括弧の外)の項数 int ones = 0; // f(E) = 1 の総数(評価値) for (char c : S) { if (c == '(') { // 新しい「項」(括弧で始まる項)を現在レベルに追加する if (st.empty()) { if (top_terms > 0) ans.push_back('+'); top_terms++; } else { if (st.back() > 0) ans.push_back('+'); st.back()++; } ans.push_back('('); st.push_back(0); } else { // ')' // この括弧の中が 2 項以上になるまで "1" を追加 while (st.back() < 2) { if (st.back() > 0) ans.push_back('+'); ans.push_back('1'); ones++; st.back()++; if (ones > K) { // もうKを超えたら不可能 cout << "No\n"; return 0; } } ans.push_back(')'); st.pop_back(); } } // Sは非空(N>=1)なので、最終形は単純な足し算にする必要があり、最上位も 2項以上必要 while (top_terms < 2) { ans += "+1"; ones++; top_terms++; if (ones > K) { cout << "No\n"; return 0; } } // 余った分は最上位に +1 を足して調整(g(E)は変わらない) while (ones < K) { ans += "+1"; ones++; } cout << "Yes\n" << ans << "\n"; return 0; }