Listing: AXA.PAS  
{$M 65000,0,655360} 
 program axa; 
 const fin='axa.in'; fout='axa.out'; 
 type sir=array[0..20000] of Integer; 
 var a:array[1..20000] of Integer; 
 i,n,maxim,nr:Longint; 
 sol:array[0..20000] of Boolean; 
 pus:^sir; 
 procedure citire; 
 var x:Integer; 
 f:Text; 
 
begin  
 New(pus); 
 Fillchar(a,Sizeof(a),0); 
 Assign(f,fin); Reset(f); 
 while not(Seekeof(f)) 
do  
  
begin  
 Read(f,x); 
 Inc(nr); 
 Inc(a[x]) 
 end; 
 n:=1; 
 while n*(n-1)<>nr*2 do Inc(n) 
 end; 
 
 procedure tiparire; 
 var f:Text; 
 i:Integer; 
 
begin  
 Assign(f,fout); 
 Rewrite(f); 
 for i:=0 to maxim 
do  
 if sol[i] 
 then Writeln(f,i); 
 Close(f); 
 Halt 
 end; 
 
  procedure cautare(max,pz:Integer); 
 var i,j:Integer; 
 m:Boolean; 
 
begin  
 while a[max]=0 do Dec(max); 
 if pz=n then tiparire; 
 if not(sol[max]) 
 
then  
  
begin  
 m:=true; 
 for i:=0 to pz-1 
do  
 if a[Abs(max-pus^[i])]>0 
 then Dec(a[Abs(max-pus^[i])]) 
 
else  
 begin 
m:=false; 
 Break 
 end; 
 if m and (i=pz-1) 
 
then  
  
begin  
 pus^[pz]:=max; 
 sol[max]:=true; 
 cautare(max,pz+1); 
 sol[max]:=false; 
 Inc(i) 
 end; 
 for j:=0 to i-1 
do  
Inc(a[Abs(max-pus^[j])]) 
 end; 
 max:=maxim-max; 
 if not(sol[max]) 
 
then  
  
begin  
 m:=true; 
 for i:=0 to pz-1 
do  
 if a[Abs(max-pus^[i])]>0 
 then Dec(a[Abs(max-pus^[i])]) 
 
else  
 begin 
m:=false; 
 Break 
 end; 
 if (m and (i=pz-1)) 
 
then  
  
begin  
 pus^[pz]:=max; 
 sol[max]:=true; 
 cautare(maxim-max,pz+1); 
 sol[max]:=false; 
 Inc(i) 
 end; 
 for j:=0 to i-1 
do  
Inc(a[Abs(max-pus^[j])]) 
 end 
 end; 
 
 Begin 
 citire; 
 for i:=1 to 20000 
do  
 if a[i]<>0 
 then maxim:=i; 
 Fillchar(sol,Sizeof(sol),false); 
 sol[0]:=true; 
 sol[maxim]:=true; 
 Dec(a[maxim]); 
 pus^[0]:=0; 
 pus^[1]:=maxim; 
 cautare(maxim,2) 
 End. 

[cuprins]