Cod sursa(job #67551)

Utilizator gurneySachelarie Bogdan gurney Data 25 iunie 2007 11:26:20
Problema P-sir Scor 0
Compilator fpc Status done
Runda preONI 2007, Runda Finala, Clasele 11-12 Marime 1.72 kb
program psir;
  const
    fin='psir.in';
    fout='psir.out';
    nmax=2000;
    eps=(1 shl 32)-1;
var
  a:array[1..nmax] of int64;
  nr:array[0..1,1..nmax,1..nmax] of int64;
  mm,m:array[1..nmax,0..nmax] of integer;
  i,j,k,n,ind:longint;
  s:int64;
  new,old:integer;
begin
  assign(input,fin);
    reset(input);
    readln(n);
    for i:=1 to n do
      read(a[i]);
    for i:=3 to n do
      begin
        for j:=1 to i-2 do
          if a[j]>a[i] then
            begin
              inc(mm[i,0]);
              mm[i,mm[i,0]]:=j;
            end;
      end;
    for i:=3 to n do
      begin
        for j:=1 to i-2 do
          if a[j]<a[i] then
            begin
              inc(m[i,0]);
              m[i,m[i,0]]:=j;
            end;
      end;
  close(input);
  assign(output,fout);
    rewrite(output);
    new:=1;old:=0;
    for i:=1 to n-1 do
      for j:=i+1 to n do
        begin
          nr[new,i,j]:=1;
          s:=(s+nr[new,i,j]) and eps;
        end;
    for k:=3 to n do
      begin
        old:=new;new:=old xor 1;
        fillchar(nr[new],sizeof(nr[new]),0);
        for i:=k-1 to n-1 do
          for j:=i+1 to n do
            begin
              if a[j]<a[i] then   //cautam nr mai mici
                begin
                  for ind:=1 to m[j,0] do
                    nr[new,i,j]:=(nr[new,i,j]+nr[old,m[j,ind],i])and eps;
                end
              else
                begin            //cautam nr mai mari
                  for ind:=1 to mm[j,0] do
                    nr[new,i,j]:=(nr[new,i,j]+nr[old,mm[j,ind],i])and eps;
                end;
              s:=(s+nr[new,i,j]) and eps;
            end;
      end;
    writeln(s);
  close(output);
end.