Pagini recente » Atasamentele paginii Clasament asddsa | Cod sursa (job #167614) | Cod sursa (job #1976940) | Diferente pentru olimpici intre reviziile 69 si 70 | Cod sursa (job #167645)
Cod sursa(job #167645)
#include<stdio.h>
#include<stdlib.h>
#define NMAX 101
int n;
long long S, v[NMAX], trei[NMAX * NMAX * NMAX];
long long i,j,k,st=1,dr;
void pivot(long long s,long long d,long long &m)
{
long long ps=0,pd=1,aux;
while(s<d)
{if(trei[s]>trei[d]) {aux=v[s]; v[s]=v[d]; v[d]=aux;
aux=ps; ps=pd; pd=aux;} s+=ps; d-=pd;}
m=s;}
int Q_Sort(long long s,long long d)
{ long long m;
if(s<d) {pivot(s,d,m);
Q_Sort(s,m-1);
Q_Sort(m+1,d);} }
int scout(long long val)
{
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
for(k=1; k<=n; k++)
if(v[i] + v[j] + v[k] == val)
{ printf("%lld %lld %lld ",v[i],v[j],v[k]);
return 0; }
return -1;}
int main()
{
freopen("loto.in","r",stdin);
freopen("loto.out","w",stdout);
scanf("%d %lld",&n,&S);
for(i=1; i<=n; i++) scanf("%lld",&v[i]);
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
for(k=1; k<=n; k++) trei[++dr] = v[i] + v[j]+ v[k];
Q_Sort(1,dr);
while(n)
{
for(; trei[st] + trei[dr] > S && st<dr; dr--);
if( trei[st] + trei[dr] == S)
{ scout(trei[st]); scout(trei[dr]); printf("\n"); return 0;}
if(st==dr) break;
for(; trei[st] + trei[dr] < S && st<dr; st++);
}
printf("-1\n");
return 0; }