4 //v: value, p: priority, l: lson, r: rson
9 bst
:longint; //bst: root of the treap
14 treap
:array [0..1100000] of treapnode
;
15 segtree
:array [0..100100] of segment
;
16 pos
,top
,x
,root
:longint;
17 data
:array [0..50010] of longint;
19 //Implementation of Treap
21 procedure new_treap(v
,root
:longint);
23 treap
[root
].p
:=random(maxlongint
);
30 procedure RightRotate(var p
:longint);
36 treap
[p
].l
:=treap
[q
].r
;
41 procedure LeftRotate(var p
:longint);
47 treap
[p
].r
:=treap
[q
].l
;
52 procedure update(p
:longint);
55 treap
[p
].size
:=treap
[treap
[p
].l
].size
+treap
[treap
[p
].r
].size
+1;
58 procedure add(v
:longint; var root
:longint); overload
;
67 if v
<treap
[root
].v
then
70 if treap
[treap
[root
].l
].p
<treap
[root
].p
then RightRotate(root
);
75 if treap
[treap
[root
].r
].p
<treap
[root
].p
then LeftRotate(root
);
78 update(treap
[root
].l
);
79 update(treap
[root
].r
);
82 procedure del(k
:longint; var root
:longint);
84 if k
<treap
[root
].v
then del(k
,treap
[root
].l
) else
85 if k
>treap
[root
].v
then del(k
,treap
[root
].r
) else
87 if (treap
[root
].l
=0) and (treap
[root
].r
=0) then
92 if (treap
[root
].l
>0) and (treap
[root
].r
=0) then root
:=treap
[root
].l
else
93 if (treap
[root
].l
=0) and (treap
[root
].r
>0) then root
:=treap
[root
].r
else
95 if treap
[treap
[root
].l
].p
<treap
[root
].p
then
103 del(k
,treap
[root
].l
);
108 update(treap
[root
].l
);
109 update(treap
[root
].r
);
112 function succ(k
,root
:longint):longint;
114 if root
=0 then exit(0);
115 if k
>=treap
[root
].v
then exit(treap
[treap
[root
].l
].size
+1+succ(k
,treap
[root
].r
));
116 exit(succ(k
,treap
[root
].l
));
121 //Implementation of SegmentTree
123 function mid(root
:longint):longint; inline;
125 exit((segtree
[root
].l
+segtree
[root
].r
) shr 1);
128 procedure BuildTree(l
,r
:longint; var root
:longint);
137 segtree
[root
].bst
:=0;
138 segtree
[root
].lson
:=0;
139 segtree
[root
].rson
:=0;
140 for i
:=l
to r
do add(data
[i
],segtree
[root
].bst
);
142 BuildTree(l
,mid(root
),segtree
[root
].lson
);
143 BuildTree(mid(root
)+1,r
,segtree
[root
].rson
);
146 procedure change(p
,v
,root
:longint); inline;
148 del(p
,segtree
[root
].bst
);
149 add(v
,segtree
[root
].bst
);
152 procedure modify(p
,v
,root
:longint); overload
;
154 change(data
[p
],v
,root
);
155 if segtree
[root
].l
=segtree
[root
].r
then exit
;
156 if p
<=mid(root
) then modify(p
,v
,segtree
[root
].lson
) else modify(p
,v
,segtree
[root
].rson
);
159 function askrank(l
,r
,v
,root
:longint):longint;
161 if (segtree
[root
].l
>=l
) and (segtree
[root
].r
<=r
) then exit(succ(v
,segtree
[root
].bst
));
162 if r
<=mid(root
) then exit(askrank(l
,r
,v
,segtree
[root
].lson
)) else
163 if l
>mid(root
) then exit(askrank(l
,r
,v
,segtree
[root
].rson
)) else
164 exit(askrank(l
,r
,v
,segtree
[root
].lson
)+askrank(l
,r
,v
,segtree
[root
].rson
));
167 function ask(l
,r
,v
:longint):longint; overload
;
169 p
,q
,mid
,t1
,t2
:longint;
177 t1
:=askrank(l
,r
,mid
,1);
178 t2
:=askrank(l
,r
,mid
-1,1);
179 if (v
<=t1
) and (v
>t2
) then exit(mid
);
180 if t1
<v
then p
:=mid
+1 else q
:=mid
;
184 procedure modify(p
,v
:longint); overload
;
199 for i
:=1 to n
do read(data
[i
]);
223 //This is the difference between BZOJ1901&ZOJ2112