int n, pos; int L[kMaxN * 4], R[kMaxN * 4], dep[kMaxN * 4], b[kMaxN], res[kMaxN]; vi vec[kMaxN * 4], vid[10];
intgetval(int x){ std::cout << "1 " << x << '\n'; fflush(stdout); int v; std::cin >> v; return v; }
vi query(vi vec){ if (vec.size() <= 1) return {}; std::cout << "2 " << vec.size() << ' '; for (auto i : vec) std::cout << i << ' '; std::cout << '\n'; fflush(stdout); vi vv(vec.size() * (vec.size() - 1) / 2); for (auto &x : vv) std::cin >> x; std::sort(vv.begin(), vv.end()); return vv; }
intgetpos(){ int L = 1, R = n, res = n, mx = 0; vi vec; for (int i = 1; i <= n; ++i) vec.emplace_back(i); auto vv = query(vec); mx = vv.back(); while (L + 1 < R) { int mid = (L + R) >> 1; vi vec; for (int i = 1; i <= mid; ++i) vec.emplace_back(i); auto ret = query(vec); if (ret.back() == mx) R = res = mid; else L = mid; } return res; }
vi operator &(vi a, vi b) { vi ret; std::unordered_map<int, int> mp; for (auto x : a) ++mp[x]; for (auto x : b) if (mp[x]) ret.emplace_back(x), --mp[x]; return ret; }
vi operator ^(vi a, vi b) { vi ret; std::unordered_map<int, int> mp; for (auto x : a) ++mp[x]; for (auto x : b) --mp[x]; for (auto [x, v] : mp) { assert(v >= 0); for (int i = 1; i <= v; ++i) ret.emplace_back(x); } return ret; }
vi getb(std::vector<int> vec){ std::vector<int> _v; for (auto x : vec) if (x != pos) _v.emplace_back(x); if (vec.size() == _v.size()) { _v.emplace_back(pos); vi a = query(vec), b = query(_v); return b ^ a; } else { vi ret = getb(_v); ret.emplace_back(0); return ret; } }
voiddickdreamer(){ std::cin >> n; if (n == 1) { int v = getval(1); std::cout << "3 " << v << '\n'; return; } pos = getpos(); build(1, 1, n); vi vv; for (int i = 1; i <= n; ++i) vv.emplace_back(i); vec[1] = getb(vv); for (int i = 1; i <= 9; ++i) { vi vec; for (auto x : vid[i]) { int l = L[x], r = R[x], mid = (l + r) >> 1; if (l != r) { for (int j = l; j <= mid; ++j) vec.emplace_back(j); } } if (!vec.size()) break; vi vl = getb(vec); for (auto x : vid[i]) { if (L[x] != R[x]) { ::vec[x << 1] = ::vec[x] & vl; ::vec[x << 1 | 1] = ::vec[x] ^ ::vec[x << 1]; } } } for (int i = 1; i <= n * 4; ++i) { if (L[i] && R[i]) { assert(vec[i].size() == R[i] - L[i] + 1); if (L[i] == R[i]) b[L[i]] = vec[i][0]; } } int pp = (pos == 1 ? 2 : 1), v1 = getval(pos), v2 = getval(pp); // std::cerr << "fuck " << b[1] << ' ' << b[2] << ' ' << b[3] << '\n'; if (v1 < v2) { for (int i = 1; i <= n; ++i) res[i] = v1 + b[i]; } else { for (int i = 1; i <= n; ++i) res[i] = v1 - b[i]; } std::cout << "3 "; for (int i = 1; i <= n; ++i) std::cout << res[i] << " \n"[i == n]; fflush(stdout); }