uses maklib, message; const ndx=100; type i4=longint; i8=int64; var nr,nd, nel : i4; sl,sr,sm,s : i8; function Max(a, b : i8): i8; inline; begin if a > b then Max := a else Max := b; end; procedure seg(a,b:i4); var x:i8; i:i4; begin s:=ElementAt(a); sm:=s; sl:=s; sr:=s; for i:=a+1 to b do begin x:=ElementAt(i); s+=x; sl:=max(sl,s); sr:=max(sr+x,x); sm:=max(sm,sr); end; end; procedure run1; var n,a,b:i4; begin n:=Receive(0); a := GetInt(n); b := GetInt(n); if a<0 then exit; seg(a,b); PutLL( n, sl ); PutLL( n, sr ); PutLL( n, sm ); PutLL( n, s ); Send( n ); end; procedure get(n:i4); var n1:i4; begin n1:=Receive(n); sl := GetLL( n ); sr := GetLL( n ); sm := GetLL( n ); s := GetLL( n ); end; procedure put(n,a,b:i4); begin PutInt( n, a ); PutInt( n, b ); Send( n ); end; function min(a, b : i4): i4; inline; begin if a < b then min := a else min := b; end; procedure obl(a,b,q:i4); var i:i4; x,y:i8; begin seg(a,b); x:=sr; y:=sm; for i:=1 to q do begin get(i); y:=max(y,x+sl); x:=max(x+s,sr); y:=max(y,max(x,sm)); end; writeln(y); end; procedure run(k:i4); var q,i,j:i4; begin i:=1+k; q:=0; while i<=nel do begin q+=1; j:=min(nel,i-1+k); put(q,i,j); i:=j+1; end; for i:=q+1 to nd-1 do put(i,-1,-1); obl(1,k,q); end; var k:i4; begin nel:=size(); nr:=MyNodeId; nd:=NumberOfNodes; if nr>0 then begin run1; exit; end; k:=(nel-1+nd) div nd; k:=max(k,min(nel,1000000)); run(k); end.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | uses maklib, message; const ndx=100; type i4=longint; i8=int64; var nr,nd, nel : i4; sl,sr,sm,s : i8; function Max(a, b : i8): i8; inline; begin if a > b then Max := a else Max := b; end; procedure seg(a,b:i4); var x:i8; i:i4; begin s:=ElementAt(a); sm:=s; sl:=s; sr:=s; for i:=a+1 to b do begin x:=ElementAt(i); s+=x; sl:=max(sl,s); sr:=max(sr+x,x); sm:=max(sm,sr); end; end; procedure run1; var n,a,b:i4; begin n:=Receive(0); a := GetInt(n); b := GetInt(n); if a<0 then exit; seg(a,b); PutLL( n, sl ); PutLL( n, sr ); PutLL( n, sm ); PutLL( n, s ); Send( n ); end; procedure get(n:i4); var n1:i4; begin n1:=Receive(n); sl := GetLL( n ); sr := GetLL( n ); sm := GetLL( n ); s := GetLL( n ); end; procedure put(n,a,b:i4); begin PutInt( n, a ); PutInt( n, b ); Send( n ); end; function min(a, b : i4): i4; inline; begin if a < b then min := a else min := b; end; procedure obl(a,b,q:i4); var i:i4; x,y:i8; begin seg(a,b); x:=sr; y:=sm; for i:=1 to q do begin get(i); y:=max(y,x+sl); x:=max(x+s,sr); y:=max(y,max(x,sm)); end; writeln(y); end; procedure run(k:i4); var q,i,j:i4; begin i:=1+k; q:=0; while i<=nel do begin q+=1; j:=min(nel,i-1+k); put(q,i,j); i:=j+1; end; for i:=q+1 to nd-1 do put(i,-1,-1); obl(1,k,q); end; var k:i4; begin nel:=size(); nr:=MyNodeId; nd:=NumberOfNodes; if nr>0 then begin run1; exit; end; k:=(nel-1+nd) div nd; k:=max(k,min(nel,1000000)); run(k); end. |