Cod sursa(job #167415)

Utilizator DanielGGlodeanu Ioan Daniel DanielG Data 29 martie 2008 16:18:51
Problema Numarare triunghiuri Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.48 kb
type list=array[1..900] of integer;
var a:list;
i,j,n,k,ls,ld,m:integer;
nr:word;
f:text;
ok:boolean;
procedure citire(var a:list);
var i:integer;
begin
for i:=1 to n do
read(f,a[i]);
end;
procedure QuickSort(var A: List; Lo, Hi: Integer);
procedure Sort(l, r: Integer);
var
  i, j, x, y: integer;
begin
  i := l; j := r; x := a[(l+r) DIV 2];
repeat
    while a[i] < x do i := i + 1;
    while x < a[j] do j := j - 1;
    if i <= j then
    begin
      y := a[i]; a[i] := a[j]; a[j] := y;
      i := i + 1; j := j - 1;
    end;
  until i > j;
  if l < j then Sort(l, j);
  if i < r then Sort(i, r);
end;
begin {QuickSort};
  Sort(Lo,Hi);
end;
begin
assign(f,'nrtri.in');reset(f);
readln(f,n);
nr:=0;
citire(a);
close(f);
quicksort(a,1,n);
assign(f,'nrtri.out');rewrite(f);
for i:=1 to n-2 do
for j:=i+1 to n-1 do
begin
ls:=j+1;
ld:=n;
ok:=false;
while ((ls<=ld) and not ok) do
begin
m:=(ls+ld) div 2;
if ((a[i]>0) and (a[j]<>0) and (a[m]<>0) and (a[i]+a[j]>=a[m]) and (a[m]+a[j]>=a[i]) and (a[i]+a[m]>=a[j])) then
begin
if m<n then
begin
if ((a[i]+a[j]<=a[m+1]) and (a[m+1]+a[j]>=a[i]) and (a[i]+a[m+1]>=a[j])) then ok:=true
end
else
begin
inc(nr);
break;
end;
end
else if (((a[i]>0) and (a[j]<>0) and (a[m]<>0) and
(a[i]+a[j]>=a[m]) and (a[m]+a[j]>=a[i]) and (a[i]+a[m]>=a[j])) and
((a[i]+a[j]>=a[m+1]) and (a[m+1]+a[j]>=a[i]) and (a[i]+a[m+1]>=a[j]))) then ls:=m+1
else ld:=m-1;
end;
if ok then nr:=nr+m-j;
end;
write(f,nr);
close(f);
end.