Cod sursa(job #497561)

Utilizator lianaliana tucar liana Data 2 noiembrie 2010 21:11:45
Problema Secv Scor 100
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.29 kb
program secv;
type element=record
  val, poz:longint;
end;
var f, g:text;
    rez, max, n, poz1, poz2:longint;
    nr:array[0..5000] of longint;
    v:array[0..5000] of element;

procedure citire;
var i:longint;
  begin
    read(f,n);
    for i:=1 to n do
      begin
        read(f,v[i].val);
        v[i].poz:=i;
        if max<v[i].val then
          max:=v[i].val;
      end;
  end;

function mai_mic(a,b:element):boolean;
  begin
    if a.val<b.val then
      mai_mic:=true
     else
       if (a.val=b.val) and (a.poz<b.poz) then
         mai_mic:=true
        else
          mai_mic:=false;
  end;

function pozitionare(i,j:longint):longint;
var x:element;
  begin
    x:=v[i];
    while i<j do
      begin
        while (j>i) and (mai_mic(x,v[j])) do
          j:=j-1;
        v[i]:=v[j];
        while (i<j) and (mai_mic(v[i],x)) do
          i:=i+1;
        v[j]:=v[i];
      end;
    v[i]:=x;
    pozitionare:=i;
  end;

procedure Qsort(st,dr:longint);
var m:longint;
  begin
    m:=pozitionare(st,dr);
    if st<m-1 then
      Qsort(st,m-1);
    if m+1<dr then
      Qsort(m+1,dr);
  end;

procedure rezolvare;
var x:longint;
  begin
    poz2:=1;
    while (v[poz2].val=v[1].val) and (poz2<n) do
      begin
        nr[poz2]:=1;
        poz2:=poz2+1;
      end;
    poz1:=1;
    rez:=maxlongint;
    nr[0]:=maxlongint;
    while poz2<=n do
      begin
        poz1:=poz2;
        while v[poz1].val=v[poz2].val do
          poz1:=poz1-1;
        x:=v[poz1].val;
        while (v[poz1].val=x) and (v[poz1].poz>v[poz2].poz) do
          poz1:=poz1-1;
        if v[poz1].val<>x then
          nr[poz2]:=maxlongint
         else
           if nr[poz1]<>maxlongint then
             nr[poz2]:=nr[poz1]+v[poz2].poz-v[poz1].poz
            else
              nr[poz2]:=maxlongint;
        if (v[poz2].val=max) and (nr[poz2]<rez) then
          rez:=nr[poz2];
        poz2:=poz2+1;
      end;
  end;

  begin
    assign(f,'secv.in'); reset(f);
    assign(g,'secv.out'); rewrite(g);
    citire;
    if n<2 then
      begin
        writeln(g,n);
        close(g);
        halt;
      end;
    Qsort(1,n);
    rezolvare;
    if rez=maxlongint then
      writeln(g,'-1')
     else
       writeln(g,rez);
    close(f);
    close(g);
  end.