Cod sursa(job #137556)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 17 februarie 2008 12:39:09
Problema Nivele Scor 10
Compilator fpc Status done
Runda preONI 2008, Runda 4, Clasele 11-12 Marime 1.57 kb
var fi,fo:text;
    T,N,i,j:longint;
    A:array[0..50001]of longint;
procedure heapsort(n:longint);
var i,j,k,aux:longint;
begin
  for i:=1 to n do
    begin
      j:=i;
      while (j shr 1<>0)and(A[j shr 1]<A[j]) do
        begin
          aux:=A[j shr 1];
          A[j shr 1]:=A[j];
          A[j]:=aux;
          j:=j shr 1;
        end;
    end;
  i:=n;
  while i>1 do
    begin
      aux:=A[1];
      A[1]:=A[i];
      A[i]:=aux;
      dec(i);
      j:=1;
      while (j>0) do
        begin
          k:=2*j;
          if (k>i) then break;
          if (k+1<=i)and(A[k+1]>A[k]) then inc(k);
          if A[j]>=A[k] then break;
          aux:=A[j];
          A[j]:=A[k];
          A[k]:=aux;
          j:=k;
        end;
    end;
end;
procedure solve;
var i,CT,NIV,nivel,putere:longint;
begin
  NIV:=0; CT:=1;
  for i:=N downto 1 do
    if A[i]=A[i-1] then inc(CT)
      else
        if ((CT+NIV)and 1=0)and((CT+NIV)<=1 shl (A[i]-1)) then
          begin
            NIV:=(CT+NIV) shr 1;
            CT:=1;
          end
        else
          begin
            writeln(fo,'NU');
            exit;
          end;
  if NIV=1 then writeln(fo,'DA')
    else
      if NIV=1 shl (nivel-1) then writeln(fo,'DA')
                             else writeln(fo,'NU');
end;
begin
  assign(fi,'nivele.in'); reset(fi);
  assign(fo,'nivele.out'); rewrite(fo);
  read(fi,T);
  for i:=1 to T do
    begin
      read(fi,N);
      for j:=1 to N do
        read(fi,A[j]);
      heapsort(N);
      solve;
    end;
  close(fi);
  close(fo);
end.