Cod sursa(job #971971)

Utilizator t.g.g.tt.g.g.t t.g.g.t Data 10 iulie 2013 17:48:36
Problema Loto Scor 100
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.82 kb
var a:array[1..3,1..200000]of longint;
    b:array[1..2,1..200000]of longint;
    n:byte;
    s,i,j,v,s2,rs,rs2,z,x:longint;
    bol:boolean;

procedure sort(i,j:longint);
   var st,dr,t,m:longint;
  begin
    m:=b[1,(i+j)div 2]; st:=i; dr:=j;
    repeat
      while b[1,i]<m do inc(i);
      while b[1,j]>m do dec(j);
      if i<=j then begin t:=b[1,i]; b[1,i]:=b[1,j]; b[1,j]:=t; t:=b[2,i]; b[2,i]:=b[2,j]; b[2,j]:=t; inc(i); dec(j); end;
    until i>j;
    if st<j then sort(st,j);
    if i<dr then sort(i,dr);
  end;

function cautare(i,j,s:longint):longint;
  var m:longint;
  begin
    m:=(i+j)div 2;
    if (i=j) and (b[1,m]<>s) then cautare:=0 else
    if b[1,m]=s then cautare:=b[2,m]
    else
      if b[1,m]>s then cautare:=cautare(i,m,s)
      else cautare:=cautare(m+1,j,s);
  end;

begin
  assign(input,'loto.in'); reset(input);
  readln(n,s);
  for i:=1 to n do read(a[3,i]);
  v:=1; x:=1;
  for i:=1 to n do begin
    inc(x,(i-1)*n);
    for j:=i to n do  begin
      inc(x,j-1);
      for z:=j to n do begin a[1,v]:=a[3,i]+a[3,j]+a[3,z]; b[1,v]:=a[1,v]; b[2,v]:=x; inc(x); inc(v); end;
    end;
  end;
  z:=v-1;
  sort(1,z);
  i:=1;
  while (bol=false) and (i<=z) do
    begin
      s2:=s-b[1,i];
      rs:=cautare(1,z,s2);
      if rs<>0 then begin bol:=true; rs2:=b[2,i]; end;
      inc(i);
    end;
  assign(output,'loto.out'); rewrite(output);
  if bol then
    begin
     i:=1; v:=0;
      while i<>4 do begin if rs mod n=0 then write(a[3,n],' ') else write(a[3,rs mod n],' '); if rs mod n <>0 then inc(v); rs:=rs div n+v; v:=0; inc(i) end;
     i:=1; v:=0;
      while i<>4 do begin if rs2 mod n=0 then write(a[3,n],' ') else write(a[3,rs2 mod n],' '); if rs2 mod n <>0 then inc(v); rs2:=rs2 div n+v; v:=0; inc(i); end;
    end else writeln('-1');
  close(output);
    end.