#include <bits/stdc++.h>
using namespace std;
using ivector = vector<int>;
using imatrix = vector<ivector>;
inline istream& operator>>(istream& is, ivector& vector) {
for (auto& elem: vector)
is >> elem;
return is; }
inline ostream& operator<<(ostream& os, const ivector& vector) {
for (auto elem: vector)
os << elem << ' ';
return os; }
inline ostream& operator<<(ostream& os, const imatrix& matrix) {
for (auto vector: matrix)
os << vector << '\n';
return os; }
struct accepted_Solution {
struct imap: map<int,int> {
imap(const ivector& nums) {
auto& count = *this;
for (auto num: nums)
++count[num]; }
void check(imatrix& A, int x, int y) const {
const auto z = -(x+y);
const auto it = lower_bound(z);
if (it == end() or it->first > z)
return;
if (z < y or (z == y and it->second == 1))
return;
A.push_back({x,y,z}); }
void check_1(imatrix& A, int x) const {
for (auto it = lower_bound(x), ie = end(); it != ie; ++it) {
const auto [y,other_count] = *it;
if (y > x or other_count > 1)
check(A,x,y); } }
void check_2(imatrix& A, int x) const {
for (auto it = lower_bound(x), ie = end(); it != ie; ++it)
check(A,x,it->first); } };
imatrix threeSum(ivector& nums) {
imatrix A;
const imap g(nums);
for (auto [x,count]: g)
if (x == 0) {
if (count > 2)
A.emplace_back(3,0); }
else if (count == 1)
g.check_1(A,x);
else
g.check_2(A,x);
return A; } };
class other_Solution {
public:
imatrix threeSum(ivector N) {
sort(N.begin(), N.end());
int n = N.size();
imatrix A;
for (int i = 0; i < n-2; i++) {
if (i > 0 and N[i] == N[i-1])
continue;
int l = i+1, r = n-1;
while (l < r) {
if (N[i] + N[l] + N[r] > 0)
r--;
else if(N[i] + N[l] + N[r] < 0)
l++;
else {
A.push_back({N[i], N[l], N[r]});
int x = N[l];
int y = N[r];
while (x == N[l] and l < n)
l++;
while (y == N[r] and r >= 0)
r--; } } }
return A; } };
int main() {
const auto do_hack = true;
random_device device;
mt19937_64 random(device());
int N;
ivector nums;
if (cin >> N, nums.resize(N), do_hack) {
int max_value, generated_test_cases;
cin >> max_value>> generated_test_cases;
uniform_int_distribution<int> uniform(-max_value,max_value);
while (generated_test_cases--) {
for (auto& num: nums)
num = uniform(random);
auto output = other_Solution().threeSum(nums);
auto expected = accepted_Solution().threeSum(nums);
if (output != expected) {
cout << "Input:" << endl << nums << endl;
cout << "Output:" << endl << output;
cout << "Expected:" << endl << expected; } }
cout << "passed"; }
else
cin >> nums, cout << accepted_Solution().threeSum(nums);
return 0; }
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIGl2ZWN0b3IgPSB2ZWN0b3I8aW50PjsKdXNpbmcgaW1hdHJpeCA9IHZlY3RvcjxpdmVjdG9yPjsKCmlubGluZSBpc3RyZWFtJiBvcGVyYXRvcj4+KGlzdHJlYW0mIGlzLCBpdmVjdG9yJiB2ZWN0b3IpIHsKICAgIGZvciAoYXV0byYgZWxlbTogdmVjdG9yKQogICAgICAgIGlzID4+IGVsZW07CiAgICByZXR1cm4gaXM7IH0KCmlubGluZSBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mIG9zLCBjb25zdCBpdmVjdG9yJiB2ZWN0b3IpIHsKICAgIGZvciAoYXV0byBlbGVtOiB2ZWN0b3IpCiAgICAgICAgb3MgPDwgZWxlbSA8PCAnICc7CiAgICByZXR1cm4gb3M7IH0KCmlubGluZSBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mIG9zLCBjb25zdCBpbWF0cml4JiBtYXRyaXgpIHsKICAgIGZvciAoYXV0byB2ZWN0b3I6IG1hdHJpeCkKICAgICAgICBvcyA8PCB2ZWN0b3IgPDwgJ1xuJzsKICAgIHJldHVybiBvczsgfQoKc3RydWN0IGFjY2VwdGVkX1NvbHV0aW9uIHsKICAgIHN0cnVjdCBpbWFwOiBtYXA8aW50LGludD4gewogICAgICAgIGltYXAoY29uc3QgaXZlY3RvciYgbnVtcykgewogICAgICAgICAgICBhdXRvJiBjb3VudCA9ICp0aGlzOwogICAgICAgICAgICBmb3IgKGF1dG8gbnVtOiBudW1zKQogICAgICAgICAgICAgICAgKytjb3VudFtudW1dOyB9CiAgICAgICAgdm9pZCBjaGVjayhpbWF0cml4JiBBLCBpbnQgeCwgaW50IHkpIGNvbnN0IHsKICAgICAgICAgICAgY29uc3QgYXV0byB6ID0gLSh4K3kpOwogICAgICAgICAgICBjb25zdCBhdXRvIGl0ID0gbG93ZXJfYm91bmQoeik7CiAgICAgICAgICAgIGlmIChpdCA9PSBlbmQoKSBvciBpdC0+Zmlyc3QgPiB6KQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBpZiAoeiA8IHkgb3IgKHogPT0geSBhbmQgaXQtPnNlY29uZCA9PSAxKSkKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgQS5wdXNoX2JhY2soe3gseSx6fSk7IH0KICAgICAgICB2b2lkIGNoZWNrXzEoaW1hdHJpeCYgQSwgaW50IHgpIGNvbnN0IHsKICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gbG93ZXJfYm91bmQoeCksIGllID0gZW5kKCk7IGl0ICE9IGllOyArK2l0KSB7CiAgICAgICAgICAgICAgICBjb25zdCBhdXRvIFt5LG90aGVyX2NvdW50XSA9ICppdDsKICAgICAgICAgICAgICAgIGlmICh5ID4geCBvciBvdGhlcl9jb3VudCA+IDEpCiAgICAgICAgICAgICAgICAgICAgY2hlY2soQSx4LHkpOyB9IH0KICAgICAgICB2b2lkIGNoZWNrXzIoaW1hdHJpeCYgQSwgaW50IHgpIGNvbnN0IHsKICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gbG93ZXJfYm91bmQoeCksIGllID0gZW5kKCk7IGl0ICE9IGllOyArK2l0KQogICAgICAgICAgICAgICAgY2hlY2soQSx4LGl0LT5maXJzdCk7IH0gfTsKICAgIGltYXRyaXggdGhyZWVTdW0oaXZlY3RvciYgbnVtcykgewogICAgICAgIGltYXRyaXggQTsKICAgICAgICBjb25zdCBpbWFwIGcobnVtcyk7CiAgICAgICAgZm9yIChhdXRvIFt4LGNvdW50XTogZykKICAgICAgICAgICAgaWYgKHggPT0gMCkgewogICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMikKICAgICAgICAgICAgICAgICAgICBBLmVtcGxhY2VfYmFjaygzLDApOyB9CiAgICAgICAgICAgIGVsc2UgaWYgKGNvdW50ID09IDEpCiAgICAgICAgICAgICAgICBnLmNoZWNrXzEoQSx4KTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZy5jaGVja18yKEEseCk7CiAgICAgICAgcmV0dXJuIEE7IH0gfTsKCmNsYXNzIG90aGVyX1NvbHV0aW9uIHsKcHVibGljOgogICAgaW1hdHJpeCB0aHJlZVN1bShpdmVjdG9yIE4pIHsKICAgICAgICBzb3J0KE4uYmVnaW4oKSwgTi5lbmQoKSk7CiAgICAgICAgaW50IG4gPSBOLnNpemUoKTsKICAgICAgICBpbWF0cml4IEE7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuLTI7IGkrKykgewogICAgICAgICAgICBpZiAoaSA+IDAgYW5kIE5baV0gPT0gTltpLTFdKQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGludCBsID0gaSsxLCByID0gbi0xOwogICAgICAgICAgICB3aGlsZSAobCA8IHIpIHsKICAgICAgICAgICAgICAgIGlmIChOW2ldICsgTltsXSArIE5bcl0gPiAwKQogICAgICAgICAgICAgICAgICAgIHItLTsKICAgICAgICAgICAgICAgIGVsc2UgaWYoTltpXSArIE5bbF0gKyBOW3JdIDwgMCkKICAgICAgICAgICAgICAgICAgICBsKys7CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBBLnB1c2hfYmFjayh7TltpXSwgTltsXSwgTltyXX0pOwogICAgICAgICAgICAgICAgICAgIGludCB4ID0gTltsXTsKICAgICAgICAgICAgICAgICAgICBpbnQgeSA9IE5bcl07CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHggPT0gTltsXSBhbmQgbCA8IG4pCiAgICAgICAgICAgICAgICAgICAgICAgIGwrKzsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeSA9PSBOW3JdIGFuZCByID49IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHItLTsgfSB9IH0KICAgICAgICByZXR1cm4gQTsgfSB9OwoKaW50IG1haW4oKSB7CiAgICBjb25zdCBhdXRvIGRvX2hhY2sgPSB0cnVlOwogICAgcmFuZG9tX2RldmljZSBkZXZpY2U7CiAgICBtdDE5OTM3XzY0IHJhbmRvbShkZXZpY2UoKSk7CiAgICBpbnQgTjsKICAgIGl2ZWN0b3IgbnVtczsKICAgIGlmIChjaW4gPj4gTiwgbnVtcy5yZXNpemUoTiksIGRvX2hhY2spIHsKICAgICAgICBpbnQgbWF4X3ZhbHVlLCBnZW5lcmF0ZWRfdGVzdF9jYXNlczsKICAgICAgICBjaW4gPj4gbWF4X3ZhbHVlPj4gZ2VuZXJhdGVkX3Rlc3RfY2FzZXM7CiAgICAgICAgdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPGludD4gdW5pZm9ybSgtbWF4X3ZhbHVlLG1heF92YWx1ZSk7CiAgICAgICAgd2hpbGUgKGdlbmVyYXRlZF90ZXN0X2Nhc2VzLS0pIHsKICAgICAgICAgICAgZm9yIChhdXRvJiBudW06IG51bXMpCiAgICAgICAgICAgICAgICBudW0gPSB1bmlmb3JtKHJhbmRvbSk7CiAgICAgICAgICAgIGF1dG8gb3V0cHV0ID0gb3RoZXJfU29sdXRpb24oKS50aHJlZVN1bShudW1zKTsKICAgICAgICAgICAgYXV0byBleHBlY3RlZCA9IGFjY2VwdGVkX1NvbHV0aW9uKCkudGhyZWVTdW0obnVtcyk7CiAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gZXhwZWN0ZWQpIHsKICAgICAgICAgICAgICAgIGNvdXQgPDwgIklucHV0OiIgPDwgZW5kbCA8PCBudW1zIDw8IGVuZGw7CiAgICAgICAgICAgICAgICBjb3V0IDw8ICJPdXRwdXQ6IiA8PCBlbmRsIDw8IG91dHB1dDsKICAgICAgICAgICAgICAgIGNvdXQgPDwgIkV4cGVjdGVkOiIgPDwgZW5kbCA8PCBleHBlY3RlZDsgfSB9CiAgICAgICAgY291dCA8PCAicGFzc2VkIjsgfQogICAgZWxzZQogICAgICAgIGNpbiA+PiBudW1zLCBjb3V0IDw8IGFjY2VwdGVkX1NvbHV0aW9uKCkudGhyZWVTdW0obnVtcyk7CiAgICByZXR1cm4gMDsgfQo=