Cod sursa(job #136847)

Utilizator corcoduscorcodus corcodus Data 16 februarie 2008 10:18:58
Problema Buline Scor 60
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.43 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
     if s+suma2>suma then
       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
         else
           begin
             if pozi2=1 then pozi2:=n
                        else pozi2:=pozi2-1;
             if pozf2=n then pozf:=1
                        else pozf2:=pozf2+1;
             if pozf2<pozi then writeln(fo,s+suma2,' ',pozf2,' ',n-pozf2+1+pozi2)
               else
                 if pozf2>pozi then writeln(fo,suma,' ',pozi,' ',pozf-pozi+1)
                   else
                     if pozf-pozi+1>n-pozf2+1+pozi2 then
                       writeln(fo,suma,' ',pozi,' ',pozf-pozi+1)
                     else writeln(fo,s+suma2,' ',pozf2,' ',n-pozf2+1+pozi2);
           end;
  close(fi);
  close(fo);
end.