Cod sursa(job #28494)

Utilizator AymdTrimbitas Viorel Stefan Aymd Data 7 martie 2007 21:37:58
Problema Buline Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.25 kb
var a,b,c:array[0..400000]of integer;
    n,max,i,s,l:longint;
    f,g:text;

begin
assign(f,'buline.in');
reset(f);
readln(f,n);
max:=-20000;
for i:=1 to n do begin
   readln(f,a[i],s);
   if s=0 then begin
               a[i]:=-a[i];
               if a[i]+b[i-1]<0 then begin
                                     b[i]:=0;
                                     c[i]:=i;
                                     if a[i]>max then max:=a[i];
                                     end
                                else begin
                                     b[i]:=a[i]+a[i-1];
                                     c[i]:=c[i-1];
                                     if b[i]>max then max:=b[i];
                                     end;
               end
          else begin
               if b[i-1]=0 then begin
                                b[i]:=a[i];
                                c[i]:=i;
                                if b[i]>max then max:=b[i];
                                end
                           else begin
                                b[i]:=a[i]+b[i-1];
                                c[i]:=c[i-1];
                                if b[i]>max then max:=b[i];
                                end;
               end;
end;
if b[n]=0 then begin end
          else begin
               if (a[1]+b[n]>0)and(c[n]<>1) then begin
                  b[1]:=b[n]+a[1];
                  c[1]:=c[n];
                  if b[1]>max then max:=b[1];
                  i:=1;
                  while (c[i]<>c[i+1])and(a[i+1]+b[i]>0)and(i<n) do begin
                     i:=i+1;
                     c[i]:=c[i-1];
                     b[i]:=a[i]+b[i-1];
                     if b[i]>max then max:=b[i];
                  end;
               end;
               end;
assign(g,'buline.out');
rewrite(g);
s:=n+1;
for i:=1 to n do begin
   if b[i]=max then if c[i]<s then begin
                                   s:=c[i];
                                   if s>i then l:=i+n-s+1;
                                   end
                              else begin
                                   s:=c[i];
                                   l:=i-s+1;
                                   end;
end;
write(g,max,' ',s,' ',l);
close(g);
end.