Cod sursa(job #227427)

Utilizator FllorynMitu Florin Danut Flloryn Data 4 decembrie 2008 16:21:41
Problema Numarare triunghiuri Scor 45
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.98 kb
program pascal;
type vector=array[1..800] of integer;
var f,g:text;
    v:vector;
    n,i,j,m,t,r,k:integer; nr:longint;

  procedure poz(li,ls:integer; var k:integer; var v:vector);
  var i,j,c,i1,j1:integer;
  begin
   i1:=0;
   j1:=-1;
   i:=li;
   j:=ls;
   while i<j do
    begin
      if v[i]>v[j] then
       begin
         c:=v[j];
         v[j]:=v[i];
         v[i]:=c;
         c:=i1;
         i1:=-j1;
         j1:=-c;
       end;
       i:=i+i1;
       j:=j+j1;
    end;
    k:=i;
  end;

  procedure quick(li,ls:integer);
  begin
   if li<ls then
    begin
     poz(li,ls,k,v);
     quick(li,k-1);
     quick(k+1,ls);
    end;
  end;

{  procedure quicksort(s,d:integer);
  var a,b,aux,ia:integer;
  begin
     a:=s; b:=d;
     repeat
     while v[a]<v[b] do b:=b-1;
     aux:=v[a];
     v[a]:=v[b];
     v[b]:=aux;
     ia:=1; a:=a+1;
     if a<b then
          begin
           while v[a]<v[b] do a:=a+1;
           if a<>b then
             begin
              aux:=v[a];
              v[a]:=v[b];
              v[b]:=aux;
              ia:=0;
              b:=b-1;
             end;
           end;
   until a>=b;
   if s<a-ia then quicksort(s,a-ia);
   if a-ia+1<d then quicksort(a-ia+1,d);
  end;}


  function caut(x,y:integer):integer;
  begin
   m:=(x+y) div 2;
   caut:=0;
   while (x<=y) and (caut=0) do
   if ((v[m]<=t) and (v[m+1]>t)) or ((v[m]<=t) and (m=n)) then  caut:=m
        else
         if (t>=v[m]) and (v[m+1]<=t) then caut:=caut(m+1,y)
                                      else caut:=caut(x,m-1);
  end;

begin
assign(f,'nrtri.in'); reset(f);
assign(g,'nrtri.out'); rewrite(g);
readln(f,n);
for i:=1 to n do
 begin
   read(f,v[i]);
 end;
quick(1,n);
nr:=0;
for i:=1 to n-1 do
   for j:=i+1 to n-1 do
     begin
     t:=v[j]+v[i];
     r:=caut(1,n); {cate numere is mai mici sau egale ca v[i]+v[j]}
     if r>=j+1 then   nr:=nr+r-(j+1)+1;
    end;

write(g,nr);
close(f);
close(g);
end.