您的位置:首页 > 产品设计 > UI/UE

线段树模板

2012-02-25 16:04 246 查看
 
const
maxn=1000000*4;
var
T:array[1..maxn] of record l,r,q:longint; end;
function max(a,b:longint):longint; begin if a>b then exit(a) else exit(b); end;
procedure build(l,r,p:longint);
var
mid:longint;
begin
T[p].l:=l;
T[p].r:=r;
T[p].q:=-maxlongint;
if l<r then begin
mid:=(l+r)div 2;
build(l,mid,p+p);
build(mid+1,r,p+p+1);
end;
end;
procedure insert(i,v:longint);
var
p:longint;
begin
p:=1;
while T[p].l<T[p].r do
if i<=(T[p].l+T[p].r)div 2 then p:=p+p
else p:=p+p+1;
T[p].q:=v;
while p>1 do begin
p:=p shr 1;
T[p].q:=max(T[p+p].q,T[p+p+1].q);
end;
end;
function query(l,r,p:longint):longint;
var
mid:longint;
begin
if T[p].l=T[p].r then exit(T[p].q)
else begin
mid:=(T[p].l+T[p].r)div 2;
if r<=mid then exit(query(l,r,p+p))
else if l>mid then exit(query(l,r,p+p+1))
else exit(max(query(l,mid,p+p),query(mid+1,r,p+p+1)));
end;
end;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  query build div insert