Cod sursa(job #2001234)

Utilizator infomaxInfomax infomax Data 16 iulie 2017 01:10:25
Problema Loto Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <bits/stdc++.h>

#define f first
#define s second

using namespace std;

FILE *F=fopen("loto.in", "r"), *G=fopen("loto.out", "w");

int n, p, S, s[350003], L[666014],  nxt[350003], vl[350003], v[350003], l, x;
const int MOD = 666013;
pair<int, pair<int, int> > pr[350003];

inline void adaug(int p, int x)
{
    vl[p] = x;
    nxt[p] = L[x%MOD];
    L[x%MOD] = p;
}

inline int caut(int x)
{
    p = L[x%MOD];
    while(p)
        if(vl[p] == x) return p;
        else p = nxt[p];
    return 0;
}

int main()
{
    fscanf(F, "%d%d ", &n, &S);
    for(int i = 1; i <= n; ++ i)
        fscanf(F, "%d ", &v[i]);
    for(int i = 1; i <= n; ++ i)
        for(int j = i; j <= n; ++ j)
            for(int k = j; k <= n; ++ k)
            {
                s[++l] = v[i]+v[j]+v[k];
                pr[l]={i, {j, k}};
                adaug(l, s[l]);
            }
    for(int i = 1; i <= l; ++ i)
    {
        x = caut(S-s[i]);
        if(x)
        {
            fprintf(G, "%d %d %d ", v[pr[i].f], v[pr[i].s.f], v[pr[i].s.s]);
            fprintf(G, "%d %d %d", v[pr[x].f], v[pr[x].s.f], v[pr[x].s.s]);
            return 0;
        }
    }
    fprintf(G, "%d", -1);
    return 0;
}