voiddel(std::vector<i64> &vec, i64 x){ std::vector<i64> ret; for (auto xx : vec) if (xx != x) ret.emplace_back(xx); vec = ret; }
std::pair<i64, i64> getpr(std::vector<i64> &vec1, std::vector<i64> &vec2, i64 x){ for (auto a : vec1) for (auto b : vec2) if (a - b == x) return {a, b}; return {-1, -1}; }
std::vector<i64> game(int n){ std::vector<i64> arr(n), res1, res2; std::vector<int> vec1, vec2, vec3, vec4; vec1 = {1, 1, 1}, vec2 = {2, 3, 4}; for (int i = 4; i <= n - 1; ++i) vec1.emplace_back(i), vec2.emplace_back(i + 1); vec3 = {2, 3, 4}, vec4 = {3, 4, 2}; for (int i = 5; i <= n; ++i) vec3.emplace_back(2), vec4.emplace_back(i); res1 = ask(work(vec1), work(vec2)), res2 = ask(work(vec3), work(vec4)); // get a[1] and {a[2], a[3], a[4]} std::map<i64, std::vector<std::pair<i64, i64>>> mp; for (auto x : res1) for (auto y : res2) mp[x + y].emplace_back(x, y); std::vector<i64> v234; i64 mxv = -1, cc = 0; for (auto [x, vec] : mp) { if (vec.size() > cc) { mxv = x, cc = vec.size(); } } i64 sum234 = 0; for (auto [x, y] : mp[mxv]) arr[0] += x, sum234 += y, del(res1, x), del(res2, y); assert(sum234 % 2 == 0); sum234 /= 2; assert(arr[0] >= sum234 && (arr[0] - sum234) % 3 == 0); arr[0] = (arr[0] - sum234) / 3; for (auto [x, y] : mp[mxv]) v234.emplace_back(x - arr[0]); for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { if (i == j) continue; auto pr = getpr(res1, res2, v234[i] - v234[j]); if (pr != std::pair<i64, i64>{-1, -1}) { arr[3] = v234[i], arr[1] = v234[j], arr[2] = v234[3 - i - j]; } } } // std::cerr << arr[0] << ' ' << arr[1] << ' ' << arr[2] << ' ' << arr[3] << ' '; for (int i = 4; i < n; ++i) { auto pr = getpr(res1, res2, arr[i - 1] - arr[1]); // assert(pr != std::pair<i64, i64>{-1, -1}); // assert(pr.first != -1 && pr.second != -1); del(res1, pr.first), del(res2, pr.second); arr[i] = pr.first - arr[i - 1]; // std::cerr << arr[i] << ' '; } // std::cerr << '\n'; return arr; }