2013-09-21 16:50
裸
// By BLADEVIL var n :longint; i :longint; x, y :longint; t, tot :longint; key, s, left, right : array [ 0 .. 100010 ] of longint; ft :longint; a, b :longint; ans :longint; procedure right_rotate( var t:longint); var k :longint; begin k: = 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 ; procedure left_rotate( var t:longint); var k :longint; begin k: = 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 ; procedure maintain( var t:longint;flag:boolean); begin if not flag then if s[left[left[t]]]>s[right[t]] then right_rotate(t) else if s[right[left[t]]]>s[right[t]] then begin left_rotate(left[t]); right_rotate(t); end else exit else if s[right[right[t]]]>s[left[t]] then left_rotate(t) else if s[left[right[t]]]>s[left[t]] then begin right_rotate(right[t]); left_rotate(t); end else exit; maintain(left[t],false); maintain(right[t],true); maintain(t,true); maintain(t,false); end ; procedure insert( var t:longint; v:longint); begin if t= 0 then begin inc(tot); t: = tot; key[t]: = v; s[t]: = 1 ; left[t]: = 0 ; right[t]: = 0 ; end else begin inc(s[t]); if v<key[t] then insert(left[t],v) else insert(right[t],v); maintain(t,v >= key[t]); end ; end ; function delete( var t:longint; v:longint):longint; begin dec(s[t]); if (v=key[t]) or (v<key[t]) and (left[t]= 0 ) or (v>key[t]) and (right[t]= 0 ) then begin delete: = key[t]; if (left[t]= 0 ) or (right[t]= 0 ) then t: =left[t]+right[t] else key[t]: =delete(left[t],key[t]+ 1 ); end else if v<key[t] then delete:=delete(left[t],v) else delete:= delete(right[t],v); end ; function pre( var t:longint; v:longint):longint; begin if t= 0 then exit(- 1 ); if v<key[t] then pre:=pre(left[t],v) else begin pre: = pre(right[t],v); if pre=- 1 then pre:= key[t]; end ; end ; function succ( var t:longint; v:longint):longint; begin if t= 0 then exit(- 1 ); if key[t]<=v then succ:=succ(right[t],v) else begin succ: = succ(left[t],v); if succ=- 1 then succ:= key[t]; end ; end ; begin read(n); ans: = 0 ; t: = 0 ; tot:= 0 ; s[t]:= 0 ; for i:= 1 to n do begin read(x,y); if x=ft then insert(t,y) else if s[t]= 0 then begin ft: = x; insert(t,y); end else begin a: =pre(t,y); b:= succ(t,y); if a=- 1 then a:=-maxlongint div 10 ; if b=- 1 then b:=maxlongint div 10 ; if abs(b-y)<abs(y-a) then begin ans: =(ans+abs(b-y)) mod 1000000 ; b: = delete(t,b); end else begin ans: =(ans+abs(y-a)) mod 1000000 ; a: = delete(t,a); end ; end ; end ; writeln(ans); end .