#include <vector>
#include <algorithm>
#include <iostream>
#include <array>
int main()
{
const int kDesired = 0;
std::vector<int> a = { 1, -1, 2, 0, -2, 4, -2, -2, 4 };
std::sort(a.begin(), a.end());
std::vector<std::array<int, 3>> triples;
for (int i = 0; i < (int)a.size(); ++i) {
const int others = kDesired - a[i];
for (int j = i + 1; j < (int)a.size(); ++j) {
for (int k = (int)a.size() - 1; k > j; --k) {
if (a[j] + a[k] == others) {
triples.push_back({ { a[i], a[j], a[k] } });
}
else if (a[j] + a[k] < others) {
break;
}
while (j + 1 < k && k < (int)a.size() && a[k] == a[k - 1]) --k;
}
while (i + 1 <= j && j < (int)a.size() - 1 && a[j] == a[j + 1]) ++j;
}
while (0 <= i && i < (int)a.size() - 1 && a[i] == a[i + 1]) ++i;
}
for (const auto& t : triples) {
std::cout << t[0] << " " << t[1] << " " << t[2] << std::endl;
}
return 0;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YXJyYXk+CmludCBtYWluKCkKewogICAgY29uc3QgaW50IGtEZXNpcmVkID0gMDsKICAgIHN0ZDo6dmVjdG9yPGludD4gYSA9IHsgMSwgLTEsIDIsIDAsIC0yLCA0LCAtMiwgLTIsIDQgfTsKICAgIHN0ZDo6c29ydChhLmJlZ2luKCksIGEuZW5kKCkpOwogICAgc3RkOjp2ZWN0b3I8c3RkOjphcnJheTxpbnQsIDM+PiB0cmlwbGVzOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KWEuc2l6ZSgpOyArK2kpIHsKICAgICAgICBjb25zdCBpbnQgb3RoZXJzID0ga0Rlc2lyZWQgLSBhW2ldOwogICAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IChpbnQpYS5zaXplKCk7ICsraikgewogICAgICAgICAgICBmb3IgKGludCBrID0gKGludClhLnNpemUoKSAtIDE7IGsgPiBqOyAtLWspIHsKICAgICAgICAgICAgICAgIGlmIChhW2pdICsgYVtrXSA9PSBvdGhlcnMpIHsKICAgICAgICAgICAgICAgICAgICB0cmlwbGVzLnB1c2hfYmFjayh7IHsgYVtpXSwgYVtqXSwgYVtrXSB9IH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoYVtqXSArIGFba10gPCBvdGhlcnMpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlIChqICsgMSA8IGsgJiYgayA8IChpbnQpYS5zaXplKCkgJiYgYVtrXSA9PSBhW2sgLSAxXSkgLS1rOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlIChpICsgMSA8PSBqICYmIGogPCAoaW50KWEuc2l6ZSgpIC0gMSAmJiBhW2pdID09IGFbaiArIDFdKSArK2o7CiAgICAgICAgfQogICAgICAgIHdoaWxlICgwIDw9IGkgJiYgaSA8IChpbnQpYS5zaXplKCkgLSAxICYmIGFbaV0gPT0gYVtpICsgMV0pICsraTsKICAgIH0KICAgIGZvciAoY29uc3QgYXV0byYgdCA6IHRyaXBsZXMpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgdFswXSA8PCAiICIgPDwgdFsxXSA8PCAiICIgPDwgdFsyXSA8PCBzdGQ6OmVuZGw7CiAgICB9CiAgICByZXR1cm4gMDsKfQ==