| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
拍了很多次都对的 为什么还会wrongtype gotree=record
l,r,m,nm,nl,nr:longint;
end;
var
tree:array[1..400000]of gotree;
a2,a3,b2,b3:longint;
a:array[1..100000]of longint;
i,n,m,x,y,ans,fly:longint;
procedure maketree(t,l,r,k,v:longint);
var
mid:longint;
begin
mid:=(l+r)shr 1;
if (r=l)and(mid=l)then
begin
tree[t].l:=1;
tree[t].r:=1;
tree[t].m:=1;
tree[t].nm:=v;
tree[t].nl:=v;
tree[t].nr:=v;
exit;
end;
if mid>=k then
maketree(t+t,l,mid,k,v)
else
maketree(t+t+1,mid+1,r,k,v);
//tree[t].n
tree[t].m:=tree[t+t].m;
tree[t].nm:=tree[t+t].nm;
if tree[t].m<tree[t+t+1].m then
begin
tree[t].m:=tree[t+t+1].m;
tree[t].nm:=tree[t+t+1].nm;
end;
if tree[t+t].nr=tree[t+t+1].nl then
begin
tree[t].nm:=tree[t+t].nr;
tree[t].m:=tree[t+t].r+tree[t+t+1].l;
end;
if tree[t+t].l>tree[t].m then
begin
tree[t].m:=tree[t+t].l;
tree[t].nm:=tree[t+t].nl;
end;
if tree[t+t+1].r>tree[t].m then
begin
tree[t].m:=tree[t+t+1].r;
tree[t].nm:=tree[t+t+1].nr;
end;
//tree[t].l
if tree[t+t].nl=tree[t+t+1].nl then
begin
tree[t].l:=tree[t+t].l+tree[t+t+1].l;
tree[t].nl:=tree[t+t].nl;
end
else
begin
tree[t].l:=tree[t+t].l;
tree[t].nl:=tree[t+t].nl;
end;
//tree[t].r
tree[t].nr:=tree[t+t+1].nr;
if tree[t+t].nr=tree[t+t+1].nr then
begin
tree[t].r:=tree[t+t].r+tree[t+t+1].r;
end
else
begin
tree[t].r:=tree[t+t+1].r;
end;
end;
procedure hunt(t,l,r,ll,rr:longint);
var
mid:longint;
begin
if (ll<=l)and(rr>=r) then
begin
if a2=-10000000 then
begin
ans:=tree[t].l;
a3:=tree[t].r;
a2:=tree[t].m;
b3:=tree[t].nr;
b2:=tree[t].nm;
end
else
begin
if b2=tree[t].nl then a2:=a2+tree[t].l;
if a2<tree[t].m then begin b2:=tree[t].nm; a2:=tree[t].m;end;
if (b3=tree[t].nl)and(ans<a3+tree[t].l) then ans:=a3+tree[t].l;
if tree[t].nr=b3 then a3:=a3+tree[t].r else
begin
a3:=tree[t].r;
b3:=tree[t].nr;
end;
end;
exit;
end;
if l=r then exit;
mid:=(l+r)shr 1;
if ll<=mid then hunt(t+t,l,mid,ll,rr);
if rr>mid then hunt(t+t+1,mid+1,r,ll,rr);
end;
begin
read(n);
while n<>0 do
begin
fillchar(tree,sizeof(tree),0);
readln(m);
for i:=1 to n do
begin
read(a[i]);
maketree(1,1,n,i,a[i]);
end;
for i:=1 to m do
begin
read(x,y);
a2:=-10000000;a3:=0;b2:=0;b3:=0;
hunt(1,1,n,x,y);
if ans<a2 then ans:=a2;
if ans<a3 then ans:=a3;
writeln(ans);
end;
read(n);
end;
end.
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator