#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> Pair;
// Function to check if Quad-tuple exists in an array with given sum
void quadTuple(int arr[], int n, int sum)
{
// create an empty map
// key -> sum of a pair of elements in the array
// value -> vector storing index of every pair having that sum
unordered_map<int, vector<Pair>> map;
// consider each element except last element
for (int i = 0; i < n - 1; i++)
{
// start from i'th element till last element
for (int j = i + 1; j < n; j++)
{
// calculate remaining sum
int val = sum - (arr[i] + arr[j]);
// if remaining sum is found in the map, we have found a Quad-tuple
if (map.find(val) != map.end())
{
// check every pair having sum equal to remaining sum
for (auto pair : map.find(val)->second)
{
int x = pair.first;
int y = pair.second;
// if Quad-tuple don't overlap, print it and return true
if ((x != i && x != j) && (y != i && y != j))
{
cout << "Quad-Tuple Found (" << arr[i] << " " << arr[j]
<< " " << arr[x] << " " << arr[y] << ")\n";
}
}
}
// insert current pair into the map
map[arr[i] + arr[j]].push_back({i, j});
}
}
}
// main function
int main()
{
int arr[] = { 2, 7, 4, 0, 9, 5, 1, 3 };
int sum = 20;
int n = sizeof(arr) / sizeof(arr[0]);
quadTuple(arr, n, sum);
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IFBhaXI7CgovLyBGdW5jdGlvbiB0byBjaGVjayBpZiBRdWFkLXR1cGxlIGV4aXN0cyBpbiBhbiBhcnJheSB3aXRoIGdpdmVuIHN1bQp2b2lkIHF1YWRUdXBsZShpbnQgYXJyW10sIGludCBuLCBpbnQgc3VtKQp7CiAgICAvLyBjcmVhdGUgYW4gZW1wdHkgbWFwCiAgICAvLyBrZXkgLT4gc3VtIG9mIGEgcGFpciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkKICAgIC8vIHZhbHVlIC0+IHZlY3RvciBzdG9yaW5nIGluZGV4IG9mIGV2ZXJ5IHBhaXIgaGF2aW5nIHRoYXQgc3VtCgl1bm9yZGVyZWRfbWFwPGludCwgdmVjdG9yPFBhaXI+PiBtYXA7CgogICAgLy8gY29uc2lkZXIgZWFjaCBlbGVtZW50IGV4Y2VwdCBsYXN0IGVsZW1lbnQKCWZvciAoaW50IGkgPSAwOyBpIDwgbiAtIDE7IGkrKykKCXsKCSAgICAvLyBzdGFydCBmcm9tIGkndGggZWxlbWVudCB0aWxsIGxhc3QgZWxlbWVudAoJCWZvciAoaW50IGogPSBpICsgMTsgaiA8IG47IGorKykKCQl7CiAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSByZW1haW5pbmcgc3VtCgkJCWludCB2YWwgPSBzdW0gLSAoYXJyW2ldICsgYXJyW2pdKTsKCgkJICAgIC8vIGlmIHJlbWFpbmluZyBzdW0gaXMgZm91bmQgaW4gdGhlIG1hcCwgd2UgaGF2ZSBmb3VuZCBhIFF1YWQtdHVwbGUKCQkJaWYgKG1hcC5maW5kKHZhbCkgIT0gbWFwLmVuZCgpKQoJCQl7CgkJCQkvLyBjaGVjayBldmVyeSBwYWlyIGhhdmluZyBzdW0gZXF1YWwgdG8gcmVtYWluaW5nIHN1bQoJCQkJZm9yIChhdXRvIHBhaXIgOiBtYXAuZmluZCh2YWwpLT5zZWNvbmQpCgkJCQl7CgkJCQkJaW50IHggPSBwYWlyLmZpcnN0OwoJCQkJCWludCB5ID0gcGFpci5zZWNvbmQ7CgoJCQkJCS8vIGlmIFF1YWQtdHVwbGUgZG9uJ3Qgb3ZlcmxhcCwgcHJpbnQgaXQgYW5kIHJldHVybiB0cnVlCgkJCQkJaWYgKCh4ICE9IGkgJiYgeCAhPSBqKSAmJiAoeSAhPSBpICYmIHkgIT0gaikpCgkJCQkJewoJCQkJCQljb3V0IDw8ICJRdWFkLVR1cGxlIEZvdW5kICgiIDw8IGFycltpXSA8PCAiICIgPDwgYXJyW2pdIAoJCQkJCQkJPDwgIiAiIDw8IGFyclt4XSA8PCAiICIgPDwgYXJyW3ldIDw8ICIpXG4iOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQkKCQkJLy8gaW5zZXJ0IGN1cnJlbnQgcGFpciBpbnRvIHRoZSBtYXAKICAgICAgICAgICAgbWFwW2FycltpXSArIGFycltqXV0ucHVzaF9iYWNrKHtpLCBqfSk7CgkJfQoJfQp9CgovLyBtYWluIGZ1bmN0aW9uCmludCBtYWluKCkKewoJaW50IGFycltdID0geyAyLCA3LCA0LCAwLCA5LCA1LCAxLCAzIH07CglpbnQgc3VtID0gMjA7CgoJaW50IG4gPSBzaXplb2YoYXJyKSAvIHNpemVvZihhcnJbMF0pOwoKCXF1YWRUdXBsZShhcnIsIG4sIHN1bSk7CgoJcmV0dXJuIDA7Cn0=