#include #include #include #include #include using namespace std; ifstream input_stream; ofstream output_stream; string tripletToStr(int64_t a, int64_t b, int64_t c) { string res = to_string(a) + " " + to_string(b) + " " + to_string(c); return res; } vector findTriplets(vector nums, int N) { vector triplets; unordered_map found; int stopI = N - 2; for (int i = 0; i < stopI; i++) { int64_t a = nums[i]; if (a > 0) { break; } int stopJ = stopI + 1; // N - 1 for (int j = i + 1; j < stopJ; j++) { int64_t b = nums[j]; if (a + b > 0) { break; } int stopK = stopJ + 1; // N for (int k = j + 1; k < stopK; k++) { int64_t c = nums[k]; if (a + b + c > 0) { break; } if (a + b + c == 0) { string tripletStr = tripletToStr(a, b, c); if (found[tripletStr] == false) { triplets.push_back(tripletStr); } } } } } return triplets; } int main() { input_stream.open("tests/input.10"); int N; input_stream >> N; if (N < 3) { cout << "NOPE" << endl; return 0; } vector nums; nums.reserve(N); int64_t tmp; for (int i = 0; i < N; i++) { input_stream >> tmp; nums.push_back(tmp); } sort(nums.begin(), nums.end()); vector triplets = findTriplets(nums, N); if (triplets.size() == 0) { cout << "NOPE" << endl; } else { for (auto it = triplets.begin(); it != triplets.end(); it++) { cout << (*it) << endl; } } input_stream.close(); return 0; }