Cod sursa(job #136841)

Utilizator corcoduscorcodus corcodus Data 16 februarie 2008 10:11:13
Problema Buline Scor 60
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.79 kb
var fi,fo:text;
    n,i,s,l,p,suma,nb,cul,pozi,pozf,suma2,pozi2,pozf2:longint;
    vl,poz:array[0..200000]of integer;
    ss:array[0..200000]of longint;
begin
  assign(fi,'buline.in'); reset(fi);
  assign(fo,'buline.out'); rewrite(fo);
  read(fi,n);
  s:=0; suma:=0; suma2:=0;
  for i:=1 to n do
    begin
      read(fi,nb,cul);
      if cul=0 then vl[i]:=-nb
               else vl[i]:=nb;
      s:=s+vl[i];
    end;
  for i:=1 to n do
    if ss[i-1]<=0 then
      begin
        ss[i]:=vl[i];
        poz[i]:=i;
        if ss[i]>suma then
          begin
            suma:=ss[i];
            pozi:=poz[i];
            pozf:=i;
          end;
      end
    else
      begin
        ss[i]:=ss[i-1]+vl[i];
        poz[i]:=poz[i-1];
        if ss[i]>suma then
          begin
            suma:=ss[i];
            pozi:=poz[i];
            pozf:=i;
          end;
      end;
  for i:=1 to n do
    begin
      vl[i]:=-vl[i];
      ss[i]:=0;
    end;
  for i:=1 to n do
    if ss[i-1]<=0 then
      begin
        ss[i]:=vl[i];
        poz[i]:=i;
        if ss[i]>suma2 then
          begin
            suma2:=ss[i];
            pozi2:=poz[i];
            pozf2:=i;
          end;
      end
    else
      begin
        ss[i]:=ss[i-1]+vl[i];
        poz[i]:=poz[i-1];
        if ss[i]>suma2 then
          begin
            suma2:=ss[i];
            pozi2:=poz[i];
            pozf2:=i;
          end;
       end;
  if suma>=s+suma2 then writeln(fo,suma,' ',pozi,' ',pozf-pozi+1)
    else
      begin
        if pozi2=1 then pozi2:=n
                   else pozi2:=pozi2-1;
        if pozf2=n then pozf2:=1
                   else pozf2:=pozf2+1;
        writeln(fo,s+suma2,' ',pozf2,' ',n-pozf2+1+pozi2);
      end;
  close(fi);
  close(fo);
end.