Cod sursa(job #166459)

Utilizator dobreDobre Catalin Andrei dobre Data 28 martie 2008 00:45:19
Problema SequenceQuery Scor 90
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.37 kb

program sequencequery;
const fi='sequencequery.in';fo='sequencequery.out';
var v:array[1..100000] of longint;
    a,b,c,sum:array[1..300000]of real;
    n,m,x,y:longint;
    i:longint;
    ans,S:real;

    f,g:text;
function max(a,b:real):real;
begin
if a>b then max:=a
   else max:=b
end;

procedure build(n,l,r:longint);
var mij:longint;
    lf,rt:longint;
begin
if l=r then begin
    A[n]:=v[l];
    B[n]:=v[l];
    C[n]:=v[l];
    sum[n]:=V[l];
   end
   else begin
     mij:=(l+r) shr 1;
     lf:=n shl 1;rt:=n shl 1+1;

     build(lf,l,mij);
     build(rt,mij+1,r);

     A[n]:=max(A[lf],sum[lf]+A[rt]);
     B[n]:=max(B[rt],B[lf]+sum[rt]);
     C[n]:=max(max(C[lf],C[rt]),B[lf]+A[rt]);
     sum[n]:=sum[lf]+sum[rt];
   end;
end;

procedure query(n,l,r:longint);
var mij:longint;
    lf,rt:longint;
begin
lf:=n shl 1;rt:=n shl 1+1;
if(l>=x)and(r<=y)then begin
    ans:=max(ans,max(C[n],S+A[n]));
    S:=max(S+sum[n],B[n]);
   end
   else begin
    mij:=(l+r) shr 1;
    if x<=mij then query(lf,l,mij);
    if y>mij then query(rt,mij+1,r);
   end;
end;

begin
assign(f,fi);reset(f);
assign(g,fo);rewrite(g);
readln(f,n,m);
for i:=1 to n do read(f,v[i]);
readln(f);
build(1,1,n);
for i:=1 to m do begin
      readln(f,x,y);
      ans:=-100000;S:=0;
      query(1,1,n);
      writeln(g,ans:0:0);
    end;
close(g);
close(f);
end.