#include #include #include #include using namespace std; static inline constexpr vector prepare(const uint32_t N, vector& X) { vector distribution(X); sort(distribution.begin(), distribution.end()); distribution.erase(unique(distribution.begin(), distribution.end()), distribution.end()); for (uint32_t i = 0; i != N; ++i) X[i] = lower_bound(distribution.begin(), distribution.end(), X[i]) - distribution.begin(); return distribution; } static inline constexpr vector solve(const uint32_t N, const uint32_t Q, const vector& X, const vector& distribution) { vector ans; vector is_appeared(N, false); ans.reserve(Q + 1); ans.emplace_back("Yes"s); uint32_t additional = 0; for (uint32_t i = 0; i != N; ++i) { if (!is_appeared[X[i]]) { ++additional, ans.emplace_back("1 "s + to_string(distribution[X[i]]) + " "s + to_string(distribution[X[i]])); is_appeared[X[i]] = true; } ans.emplace_back("2 "s + to_string(distribution[X[i]])); } if (N + additional > Q) ans.clear(), ans.emplace_back("No"s); else while (ans.size() <= Q) ans.emplace_back("1 1 1"s); return ans; } static inline void output(const vector& ans) { for (uint32_t i = 0; i != ans.size(); ++i) cout << ans[i] << '\n'; } int main() { cin.tie(nullptr); ios::sync_with_stdio(false); uint32_t N, Q, i; cin >> N >> Q; vector X(N); for (i = 0; i != N; ++i) cin >> X[i]; output(solve(N, Q, X, prepare(N, X))); return 0; }