#include #include #include using namespace std; int main(void) { vector a; /* Je-li v aktuální množině součet x+y=z, pak do soucty[z] uložíme x nebo y. */ map soucty; unsigned i, j, n, x, y; /* Načteme zadání. */ scanf("%u %u", &x, &n); for (i = 0; i < n; i++) { scanf("%u", &y); a.push_back(y); } for (i = 0; i < n; i++) { /* Je-li X rovno jednomu ze vstupních čísel, prostě ho vypíšeme. */ if (a[i] == x) { printf("%u\n", x); return 0; } if (a[i] > x) continue; /* Je-li X rovno součtu a[i] a dalších dvou čísel, vypíšeme tato tři čísla. */ if (soucty.count(x - a[i]) > 0) { unsigned b = soucty[x - a[i]]; printf("%u %u %u\n", x - b - a[i], b, a[i]); return 0; } /* Ověříme, zda X je rovno součtu a[i], a[j] a dalších dvou čísel. */ for (j = i + 1; j < n; j++) { if (a[i] + a[j] > x) continue; if (soucty.count(x - a[i] - a[j]) > 0) { unsigned b = soucty[x - a[i] - a[j]]; printf("%u %u %u %u\n", x - b - a[i] - a[j], b, a[i], a[j]); return 0; } } /* Upravíme množinu soucty přidáním součtů dvojic obsahujících a[i]. */ for (j = 0; j < i; j++) { unsigned s = a[j] + a[i]; if (s > x) continue; /* Ověříme, zda x je rovno součtu dvou čísel. */ if (s == x) { printf("%u %u\n", a[j], a[i]); return 0; } soucty[s] = a[i]; } } printf("Konec sveta se odklada\n"); return 0; }