Cod sursa(job #35223)

Utilizator azotlichidAdrian Vladu azotlichid Data 21 martie 2007 22:11:15
Problema Schi Scor 100
Compilator fpc Status done
Runda Arhiva de probleme Marime 4.17 kb
{$D-,Q-,R-}
const finame = 'schi.in';
      foname = 'schi.out';


type tvec = ^vec;
     vec  = array [1..30001] of integer;

var val, cnt, h, l, r : tvec;
    a, NULL, mcnt : integer;

    N, i, j, pos, k : integer;
    fi, fo : text;

{
    l1 : longint;
    l2 : longint absolute $0:$46c;
}

procedure init;
begin
  new(val);
  new(cnt);
  new(h);
  new(l);
  new(r);

  mcnt := 1;
  h^[1] := 0;
  cnt^[1] := 0;
  l^[1] := 0; r^[1] := 0; {point to nowhere}
  NULL := 1; a := 1;      {point to 1}
end;

function insert(_val : integer; n : integer) : integer;
begin
  if n = NULL then
  begin
    inc(mcnt);
    n := mcnt;
    val^[n] := _val;
    h^[n] := 1;
    cnt^[n] := 1;
    l^[n] := NULL;
    r^[n] := NULL;

    insert := n;
    exit;
  end;

  if pos >= cnt^[l^[n]] + 1 then
  begin
    dec(pos, cnt^[l^[n]] + 1);
    r^[n] := insert(_val, r^[n])
  end
  else
    l^[n] := insert(_val, l^[n]);

  if h^[l^[n]] > h^[r^[n]] then
    h^[n] := 1 + h^[l^[n]]
  else
    h^[n] := 1 + h^[r^[n]];


  inc(cnt^[n]);


  if h^[l^[n]] > h^[r^[n]] + 1 then
  begin
    if h^[r^[l^[n]]] > h^[l^[l^[n]]] then
    begin
      {l^[n] := leftrot(l^[n]);}
      k := r^[ l^[n] ];

      cnt^[l^[n]] := cnt^[l^[n]] - cnt^[k] + cnt^[l^[k]];
      dec(cnt^[k], cnt^[l^[k]]);

      r^[l^[n]] := l^[k];

      inc(cnt^[k], cnt^[l^[n]]);

      l^[k] := l^[n];

      if h^[l^[l^[n]]] > h^[r^[l^[n]]] then
        h^[l^[n]] := 1 + h^[l^[l^[n]]]
      else
        h^[l^[n]] := 1 + h^[r^[l^[n]]];

      if h^[l^[k]] > h^[r^[k]] then
        h^[k] := 1 + h^[l^[k]]
      else
        h^[k] := 1 + h^[r^[k]];

      l^[n] := k;

    end;


    {n := rightrot(n);}
    k := l^[n];

    cnt^[n] := cnt^[n] - cnt^[k] + cnt^[r^[k]];
    dec(cnt^[k], cnt^[r^[k]]);

    l^[n] := r^[k];

    inc(cnt^[k], cnt^[n]);

    r^[k] := n;

    if h^[l^[n]] > h^[r^[n]] then
      h^[n] := 1 + h^[l^[n]]
    else
      h^[n] := 1 + h^[r^[n]];

    if h^[l^[k]] > h^[r^[k]] then
      h^[k] := 1 + h^[l^[k]]
    else
      h^[k] := 1 + h^[r^[k]];

    n := k;
  end;

  if h^[r^[n]] > h^[l^[n]] + 1 then
  begin
    if h^[l^[r^[n]]] > h^[r^[r^[n]]] then
    begin
      {r^[n] := rightrot(r^[n]);}
      k := l^[r^[n]];

      cnt^[r^[n]] := cnt^[r^[n]] - cnt^[k] + cnt^[r^[k]];
      dec(cnt^[k], cnt^[r^[k]]);

      l^[r^[n]] := r^[k];

      inc(cnt^[k], cnt^[r^[n]]);

      r^[k] := r^[n];

      if h^[l^[r^[n]]] > h^[r^[r^[n]]] then
        h^[r^[n]] := 1 + h^[l^[r^[n]]]
      else
        h^[r^[n]] := 1 + h^[r^[r^[n]]];

      if h^[l^[k]] > h^[r^[k]] then
        h^[k] := 1 + h^[l^[k]]
      else
        h^[k] := 1 + h^[r^[k]];

      r^[n] := k;
    end;


    {n := leftrot(n);}
    k := r^[n];

    cnt^[n] := cnt^[n] - cnt^[k] + cnt^[l^[k]];
    dec(cnt^[k], cnt^[l^[k]]);

    r^[n] := l^[k];

    inc(cnt^[k], cnt^[n]);

    l^[k] := n;

    if h^[l^[n]] > h^[r^[n]] then
      h^[n] := 1 + h^[l^[n]]
    else
      h^[n] := 1 + h^[r^[n]];

    if h^[l^[k]] > h^[r^[k]] then
      h^[k] := 1 + h^[l^[k]]
    else
      h^[k] := 1 + h^[r^[k]];

    n := k;

  end;

  insert := n;
end;

procedure dfs(n : integer);
begin
  if n = NULL then exit;

  dfs(l^[n]);
  writeln(fo, val^[n]);
  dfs(r^[n]);
end;

{
procedure gen;
begin
  N := 30000;
  assign(fo, finame); rewrite(fo);
  writeln(fo, N);
  for i := 1 to N do
    writeln(fo, random(i) + 1);
  close(fo);
end;

procedure brute_force;
begin
  assign(fi, finame); reset(fi);
  readln(fi, N);

  new(cnt);

  for i := 1 to N do
  begin
    readln(fi, j);

    for k := i downto j + 1 do
      cnt^[k] := cnt^[k - 1];
    cnt^[j] := i;
  end;
  close(fi);

  assign(fo, 'schi.ok'); rewrite(fo);
  for i := 1 to N do
    writeln(fo, cnt^[i]);
  close(fo);

  dispose(cnt);
end;
}


begin
{
  l1 := l2;
}
  init;

  assign(fi, finame); reset(fi);
  readln(fi, N);

  for i := 1 to N do
  begin
    readln(fi, pos);
    dec(pos);

    a := insert(i, a);
  end;

  close(fi);

  assign(fo, foname); rewrite(fo);
  dfs(a);
  close(fo);

{
  writeln((l2 - l1) * 55,' ms');
}
end.