陈启峰SizeBalancedTree官方源码.pdf
上传人:qw****27 上传时间:2024-09-12 格式:PDF 页数:8 大小:103KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

陈启峰SizeBalancedTree官方源码.pdf

陈启峰SizeBalancedTree官方源码.pdf

预览

在线预览结束,喜欢就下载吧,查找使用更方便

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

{$inlineon}programCQF_SBT;constmaxn=2000000;varkey,s,left,right,a,b:array[0..maxn]oflongint;tt,q:longint;procedureinit;beginreadln(q);forq:=1toqdoreadln(a[q],b[q]);end;procedurework;vart,k:longint;procedureright_rotate(vart:longint);inline;begink:=left[t];left[t]:=right[k];right[k]:=t;s[k]:=s[t];s[t]:=s[left[t]]+s[right[t]]+1;t:=k;end;procedureleft_rotate(vart:longint);inline;begink:=right[t];right[t]:=left[k];left[k]:=t;s[k]:=s[t];s[t]:=s[left[t]]+s[right[t]]+1;t:=k;end;proceduremaintain(vart:longint;flag:boolean);inline;beginifflag=falsethenifs[left[left[t]]]>s[right[t]]thenright_rotate(t)elseifs[right[left[t]]]>s[right[t]]thenbeginleft_rotate(left[t]);right_rotate(t);endelseexitelseifs[right[right[t]]]>s[left[t]]thenleft_rotate(t)elseifs[left[right[t]]]>s[left[t]]thenbeginright_rotate(right[t]);left_rotate(t);endelseexit;maintain(left[t],false);maintain(right[t],true);maintain(t,true);maintain(t,false);end;procedureinsert(vart,v:longint);inline;beginift=0thenbegininc(tt);t:=tt;key[t]:=v;s[t]:=1;left[t]:=0;right[t]:=0;endelsebegininc(s[t]);ifv<key[t]theninsert(left[t],v)elseinsert(right[t],v);maintain(t,v>=key[t]);end;end;functiondelete(vart:longint;v:longint):longint;inline;begindec(s[t]);if(v=key[t])or(v<key[t])and(left[t]=0)or(v>key[t])and(right[t]=0)thenbegindelete:=key[t];if(left[t]=0)or(right[t]=0)thent:=left[t]+right[t]-0elsekey[t]:=delete(left[t],key[t]+1);endelseifv<key[t]thendelete:=delete(left[t],v)elsedelete:=delete(right[t],v);end;functionfind(vart,v:longint):boolean;inline;beginift=0thenexit(false);ifv<key[t]thenfind:=find(left[t],v)elsefind:=(key[t]=v)orfind(right[t],v);end;functionrank(vart,v:longint):longint;inline;beginift=0thenexit(1);ifv<=key[t]thenrank:=rank(left[t],v)elserank:=s[left[t]]+1+rank(right[t],v);end;functionsele