Cod sursa(job #1428573)

Utilizator casianos1996Marc Casian Nicolae casianos1996 Data 4 mai 2015 19:40:30
Problema Problema Damelor Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 1.58 kb
program siruri;
var     val,s,max,k,j,p,i,n:longint;
        nr:array[1..1000000] of longint;
        a,v:array[1..1000000] of char;
        bufin,bufout:array[1..1 shl 16] of byte;
        f,g:text;


function cauta(c:char; st,dr:longint):longint;
var      m:longint;
begin
  while st<=dr do
    begin
      m:=(st+dr) div 2;
      if c>=a[m] then dr:=m-1
        else  st:=m+1
    end;
  cauta:=st;
end;

begin
  assign(f,'siruri.in'); reset(f);
  assign(g,'siruri.out'); rewrite(g);
  settextbuf(f,bufin); settextbuf(g,bufout);
  readln(f,p);
  readln(f,n);
  for i:=1 to n do
    read(f,v[i]);
  if p=1 then
    begin
      //I'm still working on it!
      for i:=1 to n do
        nr[i]:=0;
      nr[n]:=1;
      max:=ord(v[n]);
      for i:=n-1 downto 1 do
        if ord(v[i])>max then
          begin
            max:=ord(v[i]);
            nr[i]:=1;
          end
        else
          begin
            val:=maxlongint;
            for j:=i+1 to n do
              if (v[i]<=v[j]) and (ord(v[j])<=val) then
                begin
                  val:=ord(v[j]);
                  nr[i]:=nr[i]+nr[j];
                end;
          end;
      s:=nr[1];
      for i:=2 to n do
        if max>ord(v[i]) then
          begin
            max:=ord(v[i]);
            s:=s+nr[i];
          end;
      writeln(g,s);
    end
  else
    begin
      k:=1;
      a[1]:=v[1];
      for i:=2 to n do
        begin
          j:=cauta(v[i],1,k);
          a[j]:=v[i];
          if j>k then k:=j;
        end;
      writeln(g,k);
    end;
  close(g);
end.