Cod sursa(job #165890)

Utilizator dobreDobre Catalin Andrei dobre Data 27 martie 2008 02:07:27
Problema SequenceQuery Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.46 kb
program maxq;
const fi='sequencequery.in'; fo='sequencequery.out';
var v:array[1..100000]of longint;
    a,b,c,sum:array[1..300000]of real;
    f,g:text;
    i,n,m,x,y:longint;
    lf,rt:longint;
    ans,s:real;
function maxim(a,b:real):real;
begin
if a>b then maxim:=a
   else maxim:=b;
end;

procedure build(n,st,dr:longint);
var mij:longint;
    lf,rt:longint;
begin
if(st=dr) then begin
   A[n]:=v[st];
   B[n]:=A[n];
   C[n]:=A[n];
   Sum[n]:=v[st];
  end
  else begin
        mij:=(st+dr)shr 2;
        lf:=n shl 1; rt:=n shl 1+1;
        build(lf,st,mij);
        build(rt,mij+1,dr);

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

procedure query(n,st,dr:longint);
var mij:longint;
    lf,rt:longint;
begin
if(st>=x)and(dr<=y) then begin
    ans:=maxim(maxim(ans,S+A[n]),C[n]);
    S:=maxim(S+Sum[n],B[n]);
   end
  else begin
         mij:=(st+dr)shr 2;
         lf:=n shl 1; rt:=n shl 1+1;
         if(x<=mij) then query(lf,st,mij);
         if(y>mij) then query(rt,mij+1,dr);
       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]);
build(1,1,n);
readln(f);
for i:=1 to m do begin
     readln(f,x,y);
     S:=0;Ans:=-1000000;
     query(1,1,n);
     writeln(g,ans:0:0);
   end;
close(g);
close(f);
end.