﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Mato is No.1-随笔分类-平衡树</title><link>http://www.cppblog.com/MatoNo1/category/17124.html</link><description>Mato是一只超级大沙茶……但他一直以来都想成为各项比赛都No.1的神犇……</description><language>zh-cn</language><lastBuildDate>Mon, 26 Nov 2012 15:17:10 GMT</lastBuildDate><pubDate>Mon, 26 Nov 2012 15:17:10 GMT</pubDate><ttl>60</ttl><item><title>【AHOI2013复仇】再看HDU2871</title><link>http://www.cppblog.com/MatoNo1/archive/2012/11/25/195647.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sun, 25 Nov 2012 06:54:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2012/11/25/195647.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/195647.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2012/11/25/195647.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/195647.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/195647.html</trackback:ping><description><![CDATA[<div><a title="原题地址" href="http://acm.hdu.edu.cn/showproblem.php?pid=2871">原题地址</a><br />本沙茶去年曾经用双线段树的方法捉了这题（详见<a title="这里" href="http://www.cppblog.com/MatoNo1/archive/2011/12/18/162313.html">这里</a>），最近重新审视这题发现，借助平衡树，可以得到更简单的方法。<br /><br />题目大意：<br />有一个长度为N的内存条，每个位置的状态有占用和不占用两种，有4种操作：<br />（1）Reset：清空所有内存（即将所有位置的状态改为不占用，删除所有内存块）；<br />（2）New x：申请一个新的内存块，即找到一个长度为x的连续不占用位置区间，将它们标记为占用，若有多个这样的区间，取最左边的，若木有输出Reject New；<br />（3）Free x：在已申请的内存块中，找到包含位置x的并释放（将该内存块删除，同时其占用的所有位置改为不占用），若木有内存块包含位置x，则输出Reject Free；<br />（4）Get x：找出已申请的内存块中，左起第x个，并输出其左端点；若已申请的内存块数目不足x个，则输出Reject Get。<br /><br />可以发现，每个已经申请的内存块尽管代表一段区间，但仍然是独立的单位，因此，可以把内存块当成结点，用平衡树维护（关键字为内存块的左端点位置），New操作中内存块的插入与Free操作中内存块的删除均在此平衡树内进行，Reset操作只需要将整棵树销毁即可。<br />问题是，在New操作中，需要找到一个长度为x的连续不占用区间，而连续的不占用区间并不是独立的单位，因此需要使用线段树维护。在线段树中，需要维护&lt;1&gt;结点区间内最长连续不占用块的长度；&lt;2&gt;结点区间左端、右端连续不占用块的长度（否则无法维护&lt;1&gt;）；同时，由于在New操作中需要区间整体改占用，Free操作中又需要区间整体改不占用，所以应当支持整体改值的标记，对于Reset操作，只需要全部位置改不占用即可（不能重新建树！！）；<br /><br />这样，利用一棵平衡树加一棵线段树，就可以得到一个很简单的方法了（代码量是双平衡树或双线段树的一半左右）；<br /><br />这题的启示是，在解决数据结构统计类题的时候，到底选用什么样的数据结构，是有讲究的，因为它将直接影响到编程复杂度。一般来说，线段树比平衡树好写，但是对本题而言，双线段树反而不如平衡树加线段树好写，这是因为对于内存块使用平衡树维护比使用线段树维护更好。在以后做这种题的时候，要多想一下，找到简便方法。<br /></div><img src ="http://www.cppblog.com/MatoNo1/aggbug/195647.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2012-11-25 14:54 <a href="http://www.cppblog.com/MatoNo1/archive/2012/11/25/195647.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据结构复习题汇总（不断更新中）</title><link>http://www.cppblog.com/MatoNo1/archive/2011/07/23/151685.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Fri, 22 Jul 2011 18:24:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2011/07/23/151685.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/151685.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2011/07/23/151685.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/151685.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/151685.html</trackback:ping><description><![CDATA[【1】IOI2009 hiring（这个在各大OJ上都找不到囧，只能看<a title="这里" href="http://wenku.baidu.com/view/442dd525ccbff121dd368389.html">这里</a>了囧，第11页）<br />可以发现本题就是求一个比率rate，使得第i个人（如果用的话）工资为rate*Qi，并且还要满足以下两个限制条件：<br />（1）每人的最低工资限制：第i个人如果用的话，有rate*Qi&gt;=Si，即rate&gt;=Si/Qi；<br />（2）总开销限制：rate*所有用的人的Q值之和&lt;=W，即所有用的人的Q值之和&lt;=W/rate。<br />这样，可以先将所有人按照(S/Q)的值递增排序，然后枚举需要用的最后一个人（排序后的，也就是S/Q值最大的那个人），设为i，则总花费最省的做法显然是取rate=Si/Qi。然后根据（2）式得出&#8220;所有用的人的Q值之和&#8221;的最大值W0=W/rate，其中，第i个人是必须要用的，故将W0值先减去Qi（若W0&lt;Qi，则第i个人不可使用），剩下的问题就变成了在第0~(i-1)个人中（排序后的）选取一些人，使得他们的Q值之和不大于W0，并且选取的人尽可能多。显然这可以用贪心来实现，即选取Q值最小的若干个人。接下来，由于题目中N&lt;=500000，说明需要用数据结构来优化，可是Q的上限只有20000且Q为正整数，因此，线段树是最好的选择。建立一棵表示[1, 20000]的线段树，每个结点存放两个额外的值：sz和sum，分别表示Q值位于该结点代表的区间内的人的总数以及这些人的Q值总和。然后，需要解决上述子问题时，从根结点开始考察结点的sz值，不断往下找即可（这有点像平衡树的找第K小的操作）。<br />总时间复杂度：O(N * (log20000 + logN))（还有排序的时间）<br /><a title="代码" href="http://www.ideone.com/9t1Tk">代码</a><br /><br />【2】<a title="RQNOJ469" href="http://www.rqnoj.cn/Problem_469.html">RQNOJ469</a><br />先按照任意一种属性（这里为A）递增排序，然后枚举值i，排序后第1位~第i位的全部给A（看A属性，它们中A属性最大的一定是i），排序后第(i+1)位及以后的，看其B、C两种属性的大小，若B属性更小就看B属性，若C属性更小就看C属性，然后得出两种属性的最大值即可。因此可以得到下面的算法：先排序，然后将所有的毛的B或C属性（哪种更小就看哪种）插入平衡树（这里需要两棵平衡树，一棵存放B属性的值，一棵存放C属性的值），然后递增枚举i（注意i=0的情况不要漏掉），将第i位的B或C属性在平衡树中删除，然后找出两棵平衡树中的最大值即可。<br />但是需要注意一种特殊情况：所有的毛都看同一个属性，此时按照上面的算法可能求不出最优解，比如：<br />10&nbsp;6 5<br />10 2 8<br />此时，第1个C属性更小，第2个B属性更小，若第1个看C属性，第2个看B属性，则总和为5+2=7，而如果两个都看B属性则总和为6。此时就需要特判（预先求出三种属性中的最大值），然后再用上面的算法求解，就能保证求出最优解了。<br /><a title="代码" href="http://www.ideone.com/vRduM">代码</a><br /><br />【3】<a title="PKU2985" href="http://poj.org/problem?id=2985">PKU2985</a><br />并查集+平衡树基本操作，水题，不解释。<br /><a title="代码" href="http://www.ideone.com/jQQuE">代码</a><br /><br />【4】HNOI2011 括号匹配Brackets（目前可以看<a title="这个帖子" href="http://tieba.baidu.com/p/1095271621">这个帖子</a>）<br />Splay Tree维护序列问题。对于一段括号序列A[1..len]，定义优先级P[0..len]如下：<br />P[0]=0<br />P[i]=P[i-1]+1（i&gt;0且A[i]为左括号）<br />P[i]=P[i-1]-1（i&gt;0且A[i]为右括号）<br />然后，Splay Tree的每个结点需要记录一个Z值和M值，分别表示该结点代表的括号序列中最后一个元素的优先级和优先级最小的元素的优先级。则可以证明：这段括号序列调整至平衡至少需要改变的括号数目为(-M+K+1) / 2，其中K=Z+((-M+1)/2)*2（注意这里的/是整除），此外由于有swap和invert两个操作，因此需要记录RM、TM、RTM值，分别表示将该括号序列执行swap操作后的序列的M值、执行invert操作后的序列的M值，以及同时执行swap和invert操作后序列的M值。<br /><strong style="color: red">不过，本题需要严重注意的是：虽然replace操作的标记（代码中的mk0）会覆盖掉swap（代码中的mk1）和invert（代码中的mk2）操作的标记，但是在下放标记的时候，需要对三种标记逐一判断，mk0和mk1、mk2并不是不能共存的！因为有可能先打上mk0标记后再打上mk1或mk2标记。</strong><br />本题虽然是静态的，但仍然不能使用线段树，因为线段树无法支持整体翻转（rev）操作。<br /><a title="代码" href="http://www.ideone.com/QEQl4">代码</a><br /><img src ="http://www.cppblog.com/MatoNo1/aggbug/151685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2011-07-23 02:24 <a href="http://www.cppblog.com/MatoNo1/archive/2011/07/23/151685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PKU3017</title><link>http://www.cppblog.com/MatoNo1/archive/2011/07/08/150454.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Fri, 08 Jul 2011 04:40:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2011/07/08/150454.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/150454.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2011/07/08/150454.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/150454.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/150454.html</trackback:ping><description><![CDATA[<div>【原题见<a title="这里" href="http://poj.org/problem?id=3017">这里</a>】<br /><br />本沙茶见过的最猥琐的DP题啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊&#8230;&#8230;<br /><br />设F[i]为将A[1..i]拆分成若干段的最大值最小和，则有<br />F[i]=min{F[j] +&nbsp;max[j+1, i]}（B[i]&lt;=j&lt;i），其中max[j+1, i]表示A[j+1..i]中的最大值，B[i]表示从i向左最远可以延伸到哪里（也就是满足SUM[x..i]&lt;=m的最小的x值）。B数组可以通过预处理在O(N)时间内得到。<br />边界：F[0]=0。<br /><br />下面是优化过程。JZP神犇的论文里面已经够详细了。这里只是简要说明一下。<br />首先容易证明，F是单调递增的。<br />然后一个很关键的定理是：<strong style="color: red">若F[i]的最优决策为j，则有A[j]&gt;&#8704;A[k]（j&lt;k&lt;=i）。</strong><br />证明：用反证法。若A[j+1..i]中存在不小于A[j]的值，则可得max[j..i]=max[j+1..i]，又因为F单调递增，所以F[j-1]+max[j..i]&lt;=F[j]+max[j+1.i]，即决策(j-1)一定不比决策j差，也就是决策j不可能成为最优决策。<br />这样，可以维护一个下标严格递增、A值严格递减的队列Q（即对于队列中的任意两个元素Q[i]和Q[j]，若i&lt;j，则Q[i].pos&lt;Q[j].pos且A[Q[i].pos]&gt;A[Q[j].pos]，具体实现时pos可省略）。则可能成为最优决策的决策要么是在这个队列Q里，要么是B[i]。对于队列中的某个决策Q[x]，该决策导出的值为F[Q[x]]+A[Q[x + 1]]（很容易证明max[Q[x]+1..i]=A[Q[x + 1]]），找到这些导出的值中的最小值即可（注意，队尾元素没有导出值）。对于决策B[i]，只需要在预处理的时候同时得到MAX[i]=max[B[i]+1..i]即可（也可以在O(N)时间内得到），决策B[i]导出的值为F[B[i]]+MAX[i]。<br />在删除队首过时元素的时候，需要把导出值也删除，删除队尾元素也一样，插入的时候，若插入前队列不为空，则需要插入一个导出值。也就是，需要一个支持在对数时间内进行插入、删除任意结点、找最小值等操作，显然用平衡树最好。<br /><br />注意事项：<br />（1）不管是在队首删除还是在队尾删除，若删除的是队列中的最后一个元素，则不需要在平衡树中删除导出值；<br />（2）插入时，若插入前队列为空，则不需要在平衡树中插入导出值；<br />（3）在计算F[i]时，应先将决策i压入。<br /><br />代码：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re1(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=1;&nbsp;i&lt;=n;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;MAXN&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">100001</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;node&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;r,&nbsp;p,&nbsp;sz0,&nbsp;sz,&nbsp;mul;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;v;<br />}&nbsp;T[MAXN];<br /></span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;INF&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">0Ull&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n,&nbsp;N&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;a[MAXN],&nbsp;b[MAXN],&nbsp;MAX[MAXN],&nbsp;Q[MAXN],&nbsp;front&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;rear&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;root&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;m,&nbsp;F[MAXN],&nbsp;res&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;n&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;m;<br />&nbsp;&nbsp;&nbsp;&nbsp;re1(i,&nbsp;n)&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">a[i]);&nbsp;a[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">0U</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;prepare()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;re1(i,&nbsp;n)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(a[i]&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;m)&nbsp;{res&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;sum&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;re1(i,&nbsp;n)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(sum</span><span style="color: #000000">+=</span><span style="color: #000000">a[i];&nbsp;sum</span><span style="color: #000000">&gt;</span><span style="color: #000000">m;&nbsp;sum</span><span style="color: #000000">-=</span><span style="color: #000000">a[x</span><span style="color: #000000">++</span><span style="color: #000000">])&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;re1(i,&nbsp;n)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(;&nbsp;front</span><span style="color: #000000">&lt;=</span><span style="color: #000000">rear&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;Q[front]</span><span style="color: #000000">&lt;=</span><span style="color: #000000">b[i];&nbsp;front</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(;&nbsp;front</span><span style="color: #000000">&lt;=</span><span style="color: #000000">rear&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;a[Q[rear]]</span><span style="color: #000000">&lt;=</span><span style="color: #000000">a[i];&nbsp;rear</span><span style="color: #000000">--</span><span style="color: #000000">)&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Q[</span><span style="color: #000000">++</span><span style="color: #000000">rear]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i;&nbsp;MAX[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a[Q[front]];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;vst(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(x)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;T[x].v&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vst(T[x].l);&nbsp;vst(T[x].r);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;slc(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_p,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_c)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;T[_p].l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_c;&nbsp;T[_c].p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_p;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;src(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_p,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_c)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;T[_p].r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_c;&nbsp;T[_c].p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_p;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;upd(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;T[x].sz0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[T[x].l].sz0&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;T[T[x].r].sz0&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;T[x].mul;<br />&nbsp;&nbsp;&nbsp;&nbsp;T[x].sz&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[T[x].l].sz&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;T[T[x].r].sz&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;lrot(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;y&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].p;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(y&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;root)&nbsp;T[root&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x].p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[y].p;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(y&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;T[p].l)&nbsp;slc(p,&nbsp;x);&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;src(p,&nbsp;x);}<br />&nbsp;&nbsp;&nbsp;&nbsp;src(y,&nbsp;T[x].l);&nbsp;slc(x,&nbsp;y);&nbsp;T[x].sz0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[y].sz0;&nbsp;T[x].sz&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[y].sz;&nbsp;upd(y);<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;rrot(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;y&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].p;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(y&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;root)&nbsp;T[root&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x].p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[y].p;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(y&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;T[p].l)&nbsp;slc(p,&nbsp;x);&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;src(p,&nbsp;x);}<br />&nbsp;&nbsp;&nbsp;&nbsp;slc(y,&nbsp;T[x].r);&nbsp;src(x,&nbsp;y);&nbsp;T[x].sz0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[y].sz0;&nbsp;T[x].sz&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[y].sz;&nbsp;upd(y);<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;maintain(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;ff)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;z;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(ff)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(T[T[T[x].r].r].sz&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;T[T[x].l].sz)&nbsp;{z&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].r;&nbsp;lrot(z);}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(T[T[T[x].r].l].sz&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;T[T[x].l].sz)&nbsp;{z&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[T[x].r].l;&nbsp;rrot(z);&nbsp;lrot(z);}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(T[T[T[x].l].l].sz&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;T[T[x].r].sz)&nbsp;{z&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].l;&nbsp;rrot(z);}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(T[T[T[x].l].r].sz&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;T[T[x].r].sz)&nbsp;{z&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[T[x].l].r;&nbsp;lrot(z);&nbsp;rrot(z);}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;maintain(T[z].l,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;maintain(T[z].r,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;maintain(z,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;maintain(z,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;find(</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;_v)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;root;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;v0;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(i)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].v;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(_v&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;v0)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;i;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(_v&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;v0)&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].l;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].r;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Find_Kth(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;K)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;root,&nbsp;s0,&nbsp;m0;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[T[i].l].sz0;&nbsp;m0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].mul;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(K&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;s0)&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].l;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(K&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;s0&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;m0)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;i;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{K&nbsp;</span><span style="color: #000000">-=</span><span style="color: #000000">&nbsp;s0&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;m0;&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].r;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ins(</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;_v)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">root)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T[</span><span style="color: #000000">++</span><span style="color: #000000">N].v&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_v;&nbsp;T[N].l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[N].r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[N].p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;T[N].sz0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[N].sz&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[N].mul&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;root&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;N;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;root,&nbsp;j;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;v0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T[i].sz0</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;v0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].v;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(_v&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;v0)&nbsp;{T[i].mul</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(_v&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;v0)&nbsp;j&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].l;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;j&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].r;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(j)&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;j;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T[</span><span style="color: #000000">++</span><span style="color: #000000">N].v&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_v;&nbsp;T[N].l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[N].r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;T[N].sz0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[N].sz&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[N].mul&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(_v&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;v0)&nbsp;slc(i,&nbsp;N);&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;src(i,&nbsp;N);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(i)&nbsp;{T[i].sz</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;maintain(i,&nbsp;_v&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;T[i].v);&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].p;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;del(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(T[x].mul&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T[x].mul</span><span style="color: #000000">--</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(x)&nbsp;{T[x].sz0</span><span style="color: #000000">--</span><span style="color: #000000">;&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].p;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].l,&nbsp;r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].r,&nbsp;p;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(l&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;r)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;y;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(y&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[l].r)&nbsp;l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;y;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T[x].v&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[l].v;&nbsp;T[x].mul&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[l].mul;&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[l].p;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(l&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;T[p].l)&nbsp;slc(p,&nbsp;T[l].l);&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;src(p,&nbsp;T[l].l);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(p)&nbsp;{upd(p);&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[p].p;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(x&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;root)&nbsp;T[root&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;r].p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].p;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(x&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;T[p].l)&nbsp;slc(p,&nbsp;l&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;r);&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;src(p,&nbsp;l&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;r);&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(p)&nbsp;{upd(p);&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[p].p;}}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;h(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;F[Q[x]]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;a[Q[x&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">]];<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;solve()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;F[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;front&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;rear&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;Q[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;re1(i,&nbsp;n)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(;&nbsp;front</span><span style="color: #000000">&lt;=</span><span style="color: #000000">rear&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;Q[front]</span><span style="color: #000000">&lt;</span><span style="color: #000000">b[i];)&nbsp;{</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(front&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;rear)&nbsp;del(find(h(front)));&nbsp;front</span><span style="color: #000000">++</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(;&nbsp;front</span><span style="color: #000000">&lt;=</span><span style="color: #000000">rear&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;a[Q[rear]]</span><span style="color: #000000">&lt;=</span><span style="color: #000000">a[i];)&nbsp;{</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(front&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;rear)&nbsp;del(find(h(rear&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)));&nbsp;rear</span><span style="color: #000000">--</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Q[</span><span style="color: #000000">++</span><span style="color: #000000">rear]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(front&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;rear)&nbsp;ins(h(rear&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(root)&nbsp;F[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[Find_Kth(</span><span style="color: #000000">1</span><span style="color: #000000">)].v;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;F[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;INF;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(F[b[i]]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;MAX[i]&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;F[i])&nbsp;F[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;F[b[i]]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;MAX[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;F[n];<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;pri()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;res&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;endl;<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;init();<br />&nbsp;&nbsp;&nbsp;&nbsp;prepare();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">res)&nbsp;solve();<br />&nbsp;&nbsp;&nbsp;&nbsp;pri();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /></span></div><br /></div><img src ="http://www.cppblog.com/MatoNo1/aggbug/150454.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2011-07-08 12:40 <a href="http://www.cppblog.com/MatoNo1/archive/2011/07/08/150454.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>线段树套平衡树 可修改的区间第K小问题</title><link>http://www.cppblog.com/MatoNo1/archive/2011/06/27/149605.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Mon, 27 Jun 2011 13:53:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2011/06/27/149605.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/149605.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2011/06/27/149605.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/149605.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/149605.html</trackback:ping><description><![CDATA[在没有修改操作时，应用划分树可以在O(MlogN)时间内解决查找区间第K小的问题，但是在引入修改（将原序列中的某个值改为另一个值）之后，划分树就不行了。<br />这时，需要数据结构联合的思想。<br />可以观察一下：<br />（1）区间操作：使用线段树；<br />（2）修改值（其实是先删除再插入）和找第K小：使用平衡树；<br />现在这两种操作都有，应该使用<span style="color: #ff0000"><strong>线段树+平衡树</strong></span>！<br />准确来说是线段树套平衡树，即对原序列建立一棵线段树，其中的每个结点内套一棵对该结点管辖区间内的平衡树。<br /><br />&lt;1&gt;结点类型（结构）：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;seg_node&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;r,&nbsp;mid,&nbsp;lch,&nbsp;rch,&nbsp;rt;<br />}&nbsp;T0[MAXN0];<br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;SBT_node&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;v,&nbsp;l,&nbsp;r,&nbsp;p,&nbsp;sz0,&nbsp;sz,&nbsp;mul;<br />}&nbsp;T[MAXN];<br /></span></div>其中seg_node是线段树结点类型，SBT_node是平衡树(SBT)结点类型。需要注意的是seg_node里面的rt域（root的缩写），它是该结点内套的平衡树的根结点下标索引（因为对于任意一棵平衡树，只要知道了其根结点就可以遍历整棵树）。<br /><br />&lt;2&gt;建树：<br />建树是线段树和平衡树一起建。在建立线段树结点的时候，先建立一棵空的平衡树（rt域置0），然后再在平衡树里面逐个插入该结点管辖区间内的所有元素即可；<br /><br />&lt;3&gt;修改：<br />修改操作要注意：如果要将A[x]（A为原序列）的值修改为y，则需要自顶向下遍历整棵线段树，将所有包含了A[x]的结点内的平衡树全部执行&#8220;删除v=A[x]（这个可以通过真正维护一个序列得到），再插入y&#8221;的操作；<br /><br />&lt;4&gt;找区间第K小：<br />这个操作极其麻烦。需要借助二分。<br />设要在区间[l, r]中找到第K小。首先将[l, r]拆分成若干个线段树结点，然后二分一个值x，在这些结点的平衡树中找到x的rank（这里的rank指平衡树中有多少个值比x小，不需要加1），加起来，最后再加1，就是x在[l, r]中的总名次。问题是，设[l..r]中第K小的数为v1，第(K+1)小的数为v2（如果不存在的话，v2=+&#8734;），则[v1, v2)内的数都是&#8220;第K小&#8221;的。因此，不能二分数字，而应该二分元素。设S[i]为原序列中第i小的数，二分i，然后在根结点的平衡树中找到第i小的即为S[i]，再求其名次，这样直到找到总名次为K的元素为止。问题还没完，序列中可能有元素的值相同，这时可能永远也找不到第K小的（比如序列1 2 3 3 3&nbsp;4 5，K=4，若&#8220;序列中比x小的元素总数+1&#8221;为x的名次，则永远也找不到第4小的），因此，若这样求出的&#8220;名次&#8221;小于等于K，都应该将下一次的左边界设为mid而不是(mid+1)，而&#8220;名次&#8221;大于K时，该元素肯定不是第K小的，所以下一次右边界设为(mid-1)。<br /><br />代码（本机测最猥琐数据4s以内，交到ZJU上TLE，不知为什么，神犇指点一下，3x）：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i&lt;n;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re3(i,&nbsp;l,&nbsp;r)&nbsp;for&nbsp;(int&nbsp;i=l;&nbsp;i&lt;=r;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;MAXN0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">110000</span><span style="color: #000000">,&nbsp;MAXN&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">930000</span><span style="color: #000000">,&nbsp;INF&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">0U</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;seg_node&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;r,&nbsp;mid,&nbsp;lch,&nbsp;rch,&nbsp;rt;<br />}&nbsp;T0[MAXN0];<br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;SBT_node&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;v,&nbsp;l,&nbsp;r,&nbsp;p,&nbsp;sz0,&nbsp;sz,&nbsp;mul;<br />}&nbsp;T[MAXN];<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;No0,&nbsp;No,&nbsp;n,&nbsp;root,&nbsp;rt0,&nbsp;a[MAXN0&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">],&nbsp;b[MAXN0&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">],&nbsp;l1,&nbsp;r1,&nbsp;len;<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;slc(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_p,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_c)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;T[_p].l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_c;&nbsp;T[_c].p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_p;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;src(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_p,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_c)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;T[_p].r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_c;&nbsp;T[_c].p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_p;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;upd(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;T[x].sz0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[T[x].l].sz0&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;T[T[x].r].sz0&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;T[x].mul;<br />&nbsp;&nbsp;&nbsp;&nbsp;T[x].sz&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[T[x].l].sz&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;T[T[x].r].sz&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;lrot(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;y&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].p;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(y&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;rt0)&nbsp;T[rt0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x].p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[y].p;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(y&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;T[p].l)&nbsp;slc(p,&nbsp;x);&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;src(p,&nbsp;x);}<br />&nbsp;&nbsp;&nbsp;&nbsp;src(y,&nbsp;T[x].l);&nbsp;slc(x,&nbsp;y);&nbsp;T[x].sz0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[y].sz0;&nbsp;T[x].sz&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[y].sz;&nbsp;upd(y);<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;rrot(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;y&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].p;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(y&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;rt0)&nbsp;T[rt0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x].p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[y].p;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(y&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;T[p].l)&nbsp;slc(p,&nbsp;x);&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;src(p,&nbsp;x);}<br />&nbsp;&nbsp;&nbsp;&nbsp;slc(y,&nbsp;T[x].r);&nbsp;src(x,&nbsp;y);&nbsp;T[x].sz0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[y].sz0;&nbsp;T[x].sz&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[y].sz;&nbsp;upd(y);<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;maintain(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;ff)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;z;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(ff)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(T[T[T[x].r].r].sz&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;T[T[x].l].sz)&nbsp;{z&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].r;&nbsp;lrot(z);}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(T[T[T[x].r].l].sz&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;T[T[x].l].sz)&nbsp;{z&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[T[x].r].l;&nbsp;rrot(z);&nbsp;lrot(z);}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(T[T[T[x].l].l].sz&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;T[T[x].r].sz)&nbsp;{z&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].l;&nbsp;rrot(z);}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(T[T[T[x].l].r].sz&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;T[T[x].r].sz)&nbsp;{z&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[T[x].l].r;&nbsp;lrot(z);&nbsp;rrot(z);}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;maintain(T[z].l,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;maintain(T[z].r,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;maintain(z,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;maintain(z,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;find(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_v)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rt0,&nbsp;v0;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(i)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].v;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(_v&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;v0)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;i;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(_v&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;v0)&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].l;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].r;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ins(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_v)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">rt0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T[</span><span style="color: #000000">++</span><span style="color: #000000">No].v&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_v;&nbsp;T[No].l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[No].r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[No].p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;T[No].sz0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[No].sz&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[No].mul&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;rt0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;No;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rt0,&nbsp;j,&nbsp;v0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T[i].sz0</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;v0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].v;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(_v&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;v0)&nbsp;{T[i].mul</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(_v&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;v0)&nbsp;j&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].l;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;j&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].r;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(j)&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;j;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T[</span><span style="color: #000000">++</span><span style="color: #000000">No].v&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_v;&nbsp;T[No].l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[No].r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;T[No].sz0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[No].sz&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[No].mul&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(_v&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;v0)&nbsp;slc(i,&nbsp;No);&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;src(i,&nbsp;No);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(i)&nbsp;{T[i].sz</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;maintain(i,&nbsp;_v&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;T[i].v);&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].p;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;del(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(T[x].mul&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T[x].mul</span><span style="color: #000000">--</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(x)&nbsp;{T[x].sz0</span><span style="color: #000000">--</span><span style="color: #000000">;&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].p;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].l,&nbsp;r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].r;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">l&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">r)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(x&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;rt0)&nbsp;T[rt0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;r].p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].p;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(x&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;T[p].l)&nbsp;slc(p,&nbsp;l&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;r);&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;src(p,&nbsp;l&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;r);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(p)&nbsp;{T[p].sz0</span><span style="color: #000000">--</span><span style="color: #000000">;&nbsp;T[p].sz</span><span style="color: #000000">--</span><span style="color: #000000">;&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[p].p;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l,&nbsp;j;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(j&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].r)&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;j;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T[x].v&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].v;&nbsp;T[x].mul&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].mul;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].p;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(i&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;T[p].l)&nbsp;slc(p,&nbsp;T[i].l);&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;src(p,&nbsp;T[i].l);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(p)&nbsp;{upd(p);&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[p].p;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Find_Kth(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;K)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rt0,&nbsp;s0,&nbsp;m0;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(i)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[T[i].l].sz0;&nbsp;m0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].mul;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(K&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;s0)&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].l;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(K&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;s0&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;m0)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;T[i].v;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{K&nbsp;</span><span style="color: #000000">-=</span><span style="color: #000000">&nbsp;s0&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;m0;&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].r;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;rank(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_v)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rt0,&nbsp;tot&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;v0;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(i)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].v;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(_v&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;v0)&nbsp;{tot&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;T[T[i].l].sz0;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;tot;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(_v&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;v0)&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].l;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{tot&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;T[T[i].l].sz0&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;T[i].mul;&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].r;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;tot;<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;mkt(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;T0[</span><span style="color: #000000">++</span><span style="color: #000000">No0].l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l;&nbsp;T0[No0].r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;r;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;mid&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;r&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;T0[No0].mid&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mid;&nbsp;rt0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;re3(i,&nbsp;l,&nbsp;r)&nbsp;ins(a[i]);&nbsp;T0[No0].rt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rt0;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(l&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;r)&nbsp;{</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;No00&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;No0;&nbsp;T0[No00].lch&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mkt(l,&nbsp;mid);&nbsp;T0[No00].rch&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mkt(mid&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;r);&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;No00;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{T0[No0].lch&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T0[No0].rch&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;No0;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;fs(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(x)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T0[x].l,&nbsp;r0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T0[x].r;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(l0&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;l1&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;r0&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;r1)&nbsp;b[len</span><span style="color: #000000">++</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T0[x].rt;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(l0&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;r1&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;r0&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;l1)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{fs(T0[x].lch);&nbsp;fs(T0[x].rch);}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;C(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_v)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;root,&nbsp;l0,&nbsp;r0,&nbsp;mid0,&nbsp;v0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a[x],&nbsp;N;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(i)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T0[i].l;&nbsp;r0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T0[i].r;&nbsp;mid0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T0[i].mid;&nbsp;rt0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T0[i].rt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;N&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;find(v0);&nbsp;del(N);&nbsp;ins(_v);&nbsp;T0[i].rt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rt0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(x&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;mid0)&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T0[i].lch;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T0[i].rch;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;a[x]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_v;<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Q(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;K)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;fs(root);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;ls&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;rs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;n,&nbsp;mids,&nbsp;midv,&nbsp;tot;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(ls&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;rs)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mids&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ls&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;rs&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;rt0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T0[root].rt;&nbsp;midv&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(mids);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tot&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;re(i,&nbsp;len)&nbsp;{rt0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b[i];&nbsp;tot&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;rank(midv);}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(tot&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;K)&nbsp;ls&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mids;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;rs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mids&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;rt0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T0[root].rt;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;Find_Kth(ls);<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;tests,&nbsp;m,&nbsp;x,&nbsp;y,&nbsp;K;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;ch;<br />&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">tests);<br />&nbsp;&nbsp;&nbsp;&nbsp;re(testno,&nbsp;tests)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">n,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">m);&nbsp;No0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;No&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">a[i]);&nbsp;ch&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getchar();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mkt(</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;n&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;m)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getchar();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(ch&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">C</span><span style="color: #000000">'</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d%*c</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">x,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">y);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C(</span><span style="color: #000000">--</span><span style="color: #000000">x,&nbsp;y);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d%d%*c</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">l1,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">r1,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">K);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l1</span><span style="color: #000000">--</span><span style="color: #000000">;&nbsp;r1</span><span style="color: #000000">--</span><span style="color: #000000">;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;Q(K));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /></span></div><img src ="http://www.cppblog.com/MatoNo1/aggbug/149605.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2011-06-27 21:53 <a href="http://www.cppblog.com/MatoNo1/archive/2011/06/27/149605.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Splay Tree处理区间问题的几道好题及总结</title><link>http://www.cppblog.com/MatoNo1/archive/2011/06/25/149425.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sat, 25 Jun 2011 03:21:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2011/06/25/149425.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/149425.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2011/06/25/149425.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/149425.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/149425.html</trackback:ping><description><![CDATA[<div>（1）Robotic Sort（<a title="HDU1890" href="http://acm.hdu.edu.cn/showproblem.php?pid=1890">HDU1890</a>、<a title="ZJU2985" href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2985">ZJU2985</a>）<br />本题主要考察的是对此类问题，序列中给定值的索引问题。<br />当Splay Tree用来处理一个序列的时候，其关键字就是序列中元素的下标，而不是元素的值。这样，如果要查找序列中给定的值的位置（假设序列中任意两个元素的值不相等）看起来就无法实现。其实也是有办法实现的：因为元素在树中的<span style="color: red"><strong>下标</strong></span>是永远不变的！也就是，设这个序列为A，如果A[i]在插入Splay Tree时的下标为j，那么在A[i]被删除之前，其下标一直是j，永远不会变（注意元素在序列中的下标和在树中的下标是不同的）。利用这一性质可以解决给定值的索引问题。<br />对于本题，每次将从序列中第i小的元素到序列中第i个元素（这里假定元素下标是从1开始的，而不是从0开始）之间的所有元素反转，并输出第i小的元素在反转之前的在序列中的下标。设B[i]为第i小的数的<span style="color: #ff0000"><strong>初始位置</strong></span>，S[i]为<span style="color: #ff0000"><strong>初始位置</strong></span>在第i位的元素的下标，B[i]和S[i]都可以通过预处理得到。然后，每次交换前，求出S[B[i]]在树中的排名（基本操作），再减1（因为有边界结点）就是该元素目前的位置，而序列中第i个元素就是树中第(i+1)小的元素，再执行交换即可。<br />不过需要千万注意的是本题的标记问题，在求S[B[i]]在树中的排名时，有可能其祖先结点上有标记，需要先遍历其所有的祖先结点，再逆向下放标记（标记只能自顶向下传）。另外在交换的时候需要求出S[B[i]]的后继，在求后继的过程中需要查找，此时千万别忘了下放标记（总的说，凡是有查找的地方，就有dm）<br /><a title="代码" href="http://www.ideone.com/NRqFR">代码</a>（本沙茶太弱了，是抄别人的，因此其算法和上面总结的可能有差别，神犇不要鄙视）</div><br />（2）SuperMemo（<a title="PKU3580" href="http://poj.org/problem?id=3580">PKU3580</a>）<br />本题的6个操作中，add、reverse、insert、delete、min都不难搞，而revolve操作需要涉及到区间交换。<br />可以发现，所谓的旋转其实就是交换两个相邻区间，这对于功能极强的Splay Tree来说根本不难搞。<br />设这两个相邻区间为[x, y]与[y+1, z]，假设它们均非空（也就是x&lt;=y&lt;z，因为若其中至少有一个区间是空区间，则交换没有意义），先找到树中x的前趋P与z的后继S（这里x、z等指的都是对应的结点，下同），将P伸展到根、将S伸展到根的右子结点处，则S的左子树就表示区间[x, z]。然后，设S的左子树的根结点（也就是S的左子结点）为N，在这棵子树中找到第1小的结点P0与第(y-x+2)小的结点S0（这需要涉及到找子树内第K小的操作，只要把找整棵树第K小的操作的root改为N即可），它们分别表示x与(y+1)，这样将P0伸展到N处，将S0伸展到N的右子结点处，显然P0无左子树，S0的左子树T1表示区间[x+1, y]，S0的右子树T2表示区间[y+2, z]。然后，先将S0从P0的右子结点移动到P0的左子结点，再将T1作为P0的右子树（注意移动是两步：插入和删除）。这样整棵子树的中序遍历结果变成了S0-&gt;T2-&gt;P0-&gt;T1，也就是[y+1, z]&#8746;[x, y]。<br />另外本题的标记有点难搞，只需注意rev是逆向标记，以及查找与dm共存就行了。<br /><a title="代码" href="http://www.ideone.com/HPSvO">代码</a><br />（3）Play with Chain(<a title="HDU3487" href="http://acm.hdu.edu.cn/showproblem.php?pid=3487">HDU3487</a>)<br />这个米有神马好说的，里面的操作在SuperMemo里都有；<br /><a title="代码" href="http://www.ideone.com/E4EXT">代码</a><br />（4）<a title="AHOI2006 文本编辑器(editor)" href="http://mail.bashu.cn:8080/BSoiOnline/showproblem?problem_id=2455">AHOI2006 文本编辑器(editor)</a><br />这题在这一类题里面算水的。对于光标，只要用一个值来维护就行了。<br />另外注意本题极为猥琐的2点（题目中米有说明）：一是最初的文本并不是空的，而是有一个空格；二是执行GET操作时光标可能位于文本末尾，此时应输出空格；<br /><a title="代码" href="http://www.ideone.com/dUjKz">代码</a><br />（5）HFTSC2011 高精度计算器(apc)，题目见<a title="这个帖子" href="http://tieba.baidu.com/f?kz=1039909717">这个帖子</a>；<br />这题反映出了一个很囧的问题：有些信息会被rev整体破坏。<br />本题中的操作都是常见操作，但是本题所需要维护的信息却不是那么容易维护。本题要求维护一棵子树中所有结点所表示的元素序列（中序遍历结果）模一个指定的M的值。设F[i]为R^i mod M的值（这里R是进制，也就是题目中的K），则有：<br />T[x].mod = (T[T[x].c[0]].mod * F[T[T[x].c[1]].sz + 1] + T[x].v * F[T[T[x].c[1]].sz] + T[T[x].c[1]].mod) % M;<br />这个式子其实是很好理解的。<br />关键是，本题的猥琐之处并不在此。注意本题的rev操作，它会整体改变树中所有结点所记录的mod值，这时，如果再用上面这个式子来维护T[x].mod，就会出错，因为此时引用到的T[T[x].c[0]].mod和T[T[x].c[1]].mod都是过时的。解决这一问题只有一种方法：记录&#8220;逆mod&#8221;(rmod)，意思是将整个元素序列反转后的mod，即：<br />T[x].rmod = (T[T[x].c[1]].rmod * F[T[T[x].c[0]].sz + 1] + T[x].v * F[T[T[x].c[0]].sz] + T[T[x].c[0]].rmod) % M;<br />这样，在反转某序列的时候，直接将根结点的mod值和rmod值交换就行了。<br />像mod这样会被反转操作整体破坏的信息还有很多，比如NOI2005 sequence里面的lmax和rmax。如果真的遇到这类信息，只有采用上面的方法。<br />另外，本题第6、9、10个点有误。<br /><a title="代码" href="http://www.ideone.com/FK4nQ">代码</a><br /><br />现在Splay Tree差不多弄完了，接下来还有N多知名的、不知名的高级数据结构&#8230;&#8230;时间MS有些不够用了囧&#8230;&#8230;<br /> <img src ="http://www.cppblog.com/MatoNo1/aggbug/149425.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2011-06-25 11:21 <a href="http://www.cppblog.com/MatoNo1/archive/2011/06/25/149425.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>平衡树调试技巧</title><link>http://www.cppblog.com/MatoNo1/archive/2011/06/23/149218.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Wed, 22 Jun 2011 16:07:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2011/06/23/149218.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/149218.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2011/06/23/149218.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/149218.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/149218.html</trackback:ping><description><![CDATA[平衡树操作，尤其是Splay Tree的区间操作（当线段树用的那种），代码长且极易搞疵，当操作多的时候，甚至可能调试的时间比写代码的时间都长！<br />这里来总结一下平衡树在实际应用（编程）中的易疵点和调试技巧。<br />【平衡树（这里主要指Splay Tree）的操作】<br />这个MS前面已经总结过了，主要分以下几类：<br />（1）基本操作：查找、单结点插入、单结点删除、找第K小、求结点的排名、找指定结点的前趋和后继；<br />（2）进阶操作：找给定的值在树中的前趋和后继、对一个序列建平衡树、插入整棵子树、删除整棵子树；<br />（3）区间操作（与线段树的结合）：标记（自顶向下）；<br />（4）区间操作（与线段树的结合）：最大值、总和等自底向上维护的信息；<br />（5）一些特别猥琐的操作（比如PKU3580的revolve）；<br />【主要函数及其易疵点】<br />（1）void sc(int _p, int _c, bool _d);<br />将_p的_d子结点（0左1右）置为_c，这个就三句话，应该不会搞疵；<br />（2）void upd(int x);<br />更新x记录的一些信息（自底向上维护的信息，包括大小域sz），这个，有几个信息就写几句话就行了，不易搞疵；<br />（3）void rot(int x);<br />旋转操作，将x旋转到其父结点的位置。这个函数中有两个易疵点：一是若x的父结点为根，则需要在旋转后将根置为x，且将x的父结点置为0（特别注意这个）；二是若x的父结点不为根，则需要将x的父结点的父结点的对应子结点（原来是x的父结点的那个）置为x；另外旋转完成后别忘了更新；<br />（4）void splay(int x, int r);<br />伸展操作，将x伸展到r的子结点处，这个操作是最核心的操作，只要记住了过程，且rot不搞疵，这个也就不会搞疵；<br />（5）void dm(int x);<br />对于有标记的结点的下放标记操作，极易疵！<br />首先，对于任何结点，标记一打上就必须立即生效，因此除了将x的标记取消、x的两个子结点（如果存在的话）打上标记外，还要更新两个子结点的一些域（当然这里更新千万不能用upd更新）；<br />其次，要搞清楚x的每一个标记的类型，是叠加型标记（如整体加上某一个数的标记）、覆盖型标记（如整体置为某一个数的标记）还是逆向标记（如是否翻转过的标记，因为翻转两次等于没转），然后在下放标记的时候注意写法（因为x的子结点原来可能也有标记，此时只有覆盖型标记需要将x的子结点的原来的标记覆盖掉，对于叠加型标记，应为加法运算，对于逆向标记，应为取反操作，还有其它类型的标记分别处理）；<br />最后还有一点，就是x的左子结点或右子结点可能不存在（0），此时就不能对这里的0号结点下放标记。<br />（6）int Find_Kth(int x, int K);<br />在以结点x为根的子树中找第K小的结点，返回结点编号；若省略x，默认x=root（即在整棵树中找）；<br />这个一般不会搞疵，注意两个地方即可：一是有mul域的时候需要考虑mul域，二是结点如果有标记，需要在找的时候下放标记。（凡是查找操作，包括插入新结点时的查找，在查找过程中必须不断下放标记，因为查找之后很可能就要伸展）；<br />（7）void ins(int _v);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void ins(int x, int _v)<br />插入一个值为_v的结点。前者是普通插入，后者是用Splay Tree处理序列（当线段树用）时的插入，表示在第x小的结点后插入；<br />前者注意有三种情况：树为空；树非空且值为_v的结点不存在；树非空且值为_v的结点已存在；<br />后者需要注意，在将第x小的结点伸展到根，将第(x+1)小的结点伸展到根的右子结点，再插入后，需要upd上述两个结点（注意upd顺序）；<br />（8）void del(int x);<br />将结点x删除。这个一般不会搞疵，唯一要注意的一点是删除后的upd；<br />（9）打标记操作（add、reverse、makesame等）：<br />其实打标记操作的代码量是很少的，关键就是对于不同标记要分别处理，同（5）；<br />（10）各种询问操作：<br />这个直接调出相应的域即可，几乎不可能搞疵；<br />（11）极其猥琐的操作（revolve等）：<br />这个属于最易疵的操作（否则就体现不出其猥琐了）：<br />首先要搞清楚这个操作的具体过程，不要连具体过程都搞疵了，这样写出来的代码肯定是疵的；<br />然后，注意一些非常猥琐的细节问题（很多时候，本沙茶都是栽在细节上的）；<br />另外，这些操作中一般都会出现多次伸展，别忘了伸展后的upd；<br />（12）其它易疵点：<br />[1]&#8220;移动&#8221;是由&#8220;插入&#8221;和&#8220;删除&#8221;两部分组成的，因此凡是涉及到&#8220;移动&#8221;类的操作（如将某棵子树或某个结点移动到另一个位置等），必须要同时出现&#8220;插入&#8221;和&#8220;删除&#8221;，而不能只插入不删除；<br />[2]注意检查主函数main()中是否有搞疵的地方；<br /><br />易疵点也就这么多了，下面是调试技巧：<br />【Splay Tree调试技巧】<br />（1）先用样例调试，保证样例能够通过（注意，样例中必须包含所有题目中给出的操作，如果不是这样，那在调试完样例后还要加一组包含所有题目中给出的操作的小数据）；<br />（2）然后用mkdt造大数据，一般平衡树操作题的合法数据都不难造，只要注意别越界就行了；<br />（3）在调试过程中应不断少量增大数据规模，因为在能找出问题的情况下，数据规模越小越好；<br />（4）如果调试过程中发现死循环或者RE：<br />[1]首先输出每个操作，找出是在哪个操作处出了问题；<br />[2]进入该操作内部检查，也就是把该操作的代码读一遍，一般都能找出问题；<br />[3]如果找不出问题，可以进入该操作内部跟踪检查；<br />[4]如果跟踪检查仍然没找出问题，那可能是该操作是对的，而其它操作出了问题，此时可以弄一个vst，把整棵树遍历一下，找出真正出问题的操作，转[2]；<br />（5）排除了死循环或RE后，接下来就是检查输出结果是否正确了：<br />[1]对于小规模数据可人工计算检查，对于较大规模数据则必须采用对照方法，即弄一个模拟法的代码，保证该代码正确，然后进行对照；<br />[2]如果发现加入遍历时，结果正确，但去掉遍历后结果不正确，则表明是处理结点标记的时候出了问题（因为在遍历过程中需要下放标记），进入dm或加标记操作中检查即可；<br />[3]其它情况下，可以在遍历中输出整个序列（或整棵树），进行对照，找出问题所在；<br />[4]如果数据过大，操作过多，人工分析时间较长，就只能采用读代码的方式检查了；<br />（6）最后，用mkdt造一个最大规模的数据，检查是否TLE、是否越界（数组是否开小）；<br />如果以上各点全部通过，就可以宣布AC了。<br /><img src ="http://www.cppblog.com/MatoNo1/aggbug/149218.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2011-06-23 00:07 <a href="http://www.cppblog.com/MatoNo1/archive/2011/06/23/149218.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【NOI2005 维护数列(sequence)】Splay Tree处理序列问题</title><link>http://www.cppblog.com/MatoNo1/archive/2011/06/21/149121.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Tue, 21 Jun 2011 08:06:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2011/06/21/149121.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/149121.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2011/06/21/149121.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/149121.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/149121.html</trackback:ping><description><![CDATA[<div>【原题见<a title="这里" href="http://mail.bashu.cn:8080/BSoiOnline/showproblem?problem_id=2246">这里</a>】<br />本题是Splay Tree处理序列问题（也就是当线段树用）的一个典型例题。<br /><br />Splay Tree之所以可以当线段树用，是因为它可以支持一个序列，然后用&#8220;左端前趋伸展到根，右端后继伸展到根的右子结点，取根的右子结点的左子结点&#8221;这种伸展方法，对一个序列中的一整段进行整体操作。由于要防止出现前趋或后继不存在的情况，需要在这个序列的两端加入两个边界结点，要求其值不能影响到结点各种记载信息的维护（多取0、&#8734;或-&#8734;）。这两个边界结点在树中永远存在，不会被删除。<br /><br />（1）结点的引用：<br />在当线段树用的Splay Tree中，真正的关键字是下标而不是值，因此，&#8220;序列中第i个结点&#8221;实际上对应的是&#8220;树中第(i+1)小的结点&#8221;（因为左边还有一个边界结点），这就说明在对结点引用时需要找第K小的操作。因此，下面的&#8220;结点x&#8221;指的是&#8220;树中第(x+1)小的结点&#8221;。<br />（2）标记：<br />在线段树中，如果对一个结点所表示的线段整体进行了某种操作，需要在这个结点上打上一个标记，在下一次再找到这个结点时，其标记就会下放到其两个子结点上。在Splay Tree中也可以引入标记。比如要对[2, 6]这一段进行整体操作，就将结点1伸展到根的位置，将结点7伸展到根的右子树的位置，然后结点7的左子树就表示[2, 6]这一段，对这棵子树的根结点打上标记并立即生效（必须是立即生效，而不是等下一次引用再生效），也就是立即改变该结点记录的一些信息的值。如果下次再次引用到这个结点，就要将其标记下放到其两个子结点处；<br />需要注意的一点是，如果要伸展某个结点x到r的子结点的位置，就必须保证从x原来的位置到r的这个子结点（x伸展后的位置）上的所有结点上均没有标记，否则就会导致标记混乱。因此，必须首先找到这个结点x，在此过程中不断下放标记。<br />（3）自底向上维护的信息：<br />标记可以看成一种自顶向下维护的信息。除了标记以外，作为&#8220;线段树&#8221;，往往还要维护一些自底向上维护的信息。比如在sequence这题中，就有lmax（左段连续最大和）、rmax（右段连续最大和）、midmax（全段连续最大和）以及sum（全段总和）等信息要维护。对于这类东东其实也很好办，因为子树大小（sz域）就是一种自底向上维护的信息，因此对于这些信息只要按照维护sz域的办法维护即可（统一写在upd函数里）。唯一的不同点是打标记时它们的值可能要改变。<br />（4）对连续插入的结点建树：<br />本题的插入不是一个一个插入，而是一下子插入一整段，因此需要先将它们建成一棵树。一般建树操作都是递归的，这里也一样。设目前要对A[l..r]建树（A为待插入序列），若l&gt;r则退出，否则找到位于中间的元素mid = l + r &gt;&gt; 1，将A[mid]作根，再对A[l..mid-1]建左子树，对A[mid+1..r]建右子树即可。这样可以保证一开始建的就是一棵平衡树，减小常数因子。<br />（5）回收空间：<br />根据本题的数据范围提示，插入的结点总数最多可能达到4000000，但在任何时刻树中最多只有500002个结点（包括两个边界），此时为了节省空间，可以采用循环队列回收空间的方法。即：一开始将所有的可用空间（可用下标，本题为1~500002）存在循环队列Q里，同时设立头尾指针front和rear，每次如果有新结点插入，就取出Q[front]并作为新结点的下标，如果有结点要删除（本题是一次删除整棵子树，因此在删除后需要分别回收它们的空间），则从rear开始，将每个删除的结点的下标放回到Q里。当然，这种方法是要牺牲一定的时间的，因此在空间不是特别吃紧的情况下不要用。<br /><br />【2012年1月16日更新】<br />今天重写sequence的时候，秃然发现加入的边界点可能会对lmax、rmax、midmax等的维护造成影响：当序列中所有的值都是负数时，若边界点的值设为0，将使这3个值也为0，所以，边界点的值应设为-INF（不会影响到sum，因为可以单独调出[l, r]的sum，避开边界）。这就说明并非所有这样的题中都可以设置边界点（比如HFTSC2011的那题就不行），如果边界点会对维护的信息造成影响，就不能设置边界点，在各个操作中，分4种情况判断。（代码已经修改）<br /><br />下面上代码了： 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i&lt;n;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re1(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=1;&nbsp;i&lt;=n;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;MAXN&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">500002</span><span style="color: #000000">,&nbsp;NOSM&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">2000</span><span style="color: #000000">,&nbsp;INF&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">0U</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;node&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;v,&nbsp;c[</span><span style="color: #000000">2</span><span style="color: #000000">],&nbsp;p,&nbsp;sz,&nbsp;sum,&nbsp;lmax,&nbsp;rmax,&nbsp;midmax,&nbsp;sm;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;rev,&nbsp;d;<br />}&nbsp;T[MAXN&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">];<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;root,&nbsp;Q[MAXN&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">],&nbsp;front,&nbsp;rear,&nbsp;a[MAXN],&nbsp;len,&nbsp;res;<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;max(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;SS0,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;SS1)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;SS0&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;SS1&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;SS0&nbsp;:&nbsp;SS1;<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;max(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;SS0,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;SS1,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;SS2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;M0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;SS0&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;SS1&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;SS0&nbsp;:&nbsp;SS1;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;M0&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;SS2&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;M0&nbsp;:&nbsp;SS2;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;newnode(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_v)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;T[n].v&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[n].sum&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[n].lmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[n].rmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[n].midmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_v;&nbsp;T[n].c[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[n].c[</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;T[n].sz&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;T[n].sm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NOSM;&nbsp;T[n].rev&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;sc(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_p,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_c,&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;_d)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;T[_p].c[_d]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_c;&nbsp;T[_c].p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_p;&nbsp;T[_c].d&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_d;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;sm_opr(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;SM)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;T[x].sum&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].sz&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;SM;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(SM&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;T[x].lmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].rmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].midmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].sum;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;T[x].lmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].rmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].midmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;SM;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;rev_opr(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;c0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].c[</span><span style="color: #000000">0</span><span style="color: #000000">],&nbsp;c1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].c[</span><span style="color: #000000">1</span><span style="color: #000000">];&nbsp;sc(x,&nbsp;c0,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;sc(x,&nbsp;c1,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;tmp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].lmax;&nbsp;T[x].lmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].rmax;&nbsp;T[x].rmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tmp;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;dm(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;SM0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].sm;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(SM0&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;NOSM)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T[x].v&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[T[x].c[</span><span style="color: #000000">0</span><span style="color: #000000">]].sm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[T[x].c[</span><span style="color: #000000">1</span><span style="color: #000000">]].sm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;SM0;&nbsp;T[x].sm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NOSM;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sm_opr(T[x].c[</span><span style="color: #000000">0</span><span style="color: #000000">],&nbsp;SM0);&nbsp;sm_opr(T[x].c[</span><span style="color: #000000">1</span><span style="color: #000000">],&nbsp;SM0);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(T[x].rev)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T[T[x].c[</span><span style="color: #000000">0</span><span style="color: #000000">]].rev&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">T[T[x].c[</span><span style="color: #000000">0</span><span style="color: #000000">]].rev;&nbsp;T[T[x].c[</span><span style="color: #000000">1</span><span style="color: #000000">]].rev&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">T[T[x].c[</span><span style="color: #000000">1</span><span style="color: #000000">]].rev;&nbsp;T[x].rev&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rev_opr(T[x].c[</span><span style="color: #000000">0</span><span style="color: #000000">]);&nbsp;rev_opr(T[x].c[</span><span style="color: #000000">1</span><span style="color: #000000">]);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;upd(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;c0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].c[</span><span style="color: #000000">0</span><span style="color: #000000">],&nbsp;c1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].c[</span><span style="color: #000000">1</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;T[x].sz&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[c0].sz&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;T[c1].sz&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;T[x].sum&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[c0].sum&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;T[c1].sum&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;T[x].v;<br />&nbsp;&nbsp;&nbsp;&nbsp;T[x].lmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;max(T[c0].lmax,&nbsp;T[c0].sum&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;T[x].v&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;max(T[c1].lmax,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;T[x].rmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;max(T[c1].rmax,&nbsp;max(T[c0].rmax,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;T[x].v&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;T[c1].sum);<br />&nbsp;&nbsp;&nbsp;&nbsp;T[x].midmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;max(T[c0].midmax,&nbsp;T[c1].midmax,&nbsp;max(T[c0].rmax,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;T[x].v&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;max(T[c1].lmax,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">));<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;rot(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;y&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].p;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;d&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].d;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(y&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;root)&nbsp;{root&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x;&nbsp;T[root].p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;sc(T[y].p,&nbsp;x,&nbsp;T[y].d);<br />&nbsp;&nbsp;&nbsp;&nbsp;sc(y,&nbsp;T[x].c[</span><span style="color: #000000">!</span><span style="color: #000000">d],&nbsp;d);&nbsp;sc(x,&nbsp;y,&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">d);&nbsp;upd(y);<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;splay(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;p;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;((p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].p)&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;r)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(T[p].p&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;r)&nbsp;rot(x);&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(T[x].d&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;T[p].d)&nbsp;{rot(p);&nbsp;rot(x);}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{rot(x);&nbsp;rot(x);}&nbsp;upd(x);<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Find_Kth(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;K)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;root,&nbsp;S0;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(i)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dm(i);&nbsp;S0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[T[i].c[</span><span style="color: #000000">0</span><span style="color: #000000">]].sz&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(K&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;S0)&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(K&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;S0)&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].c[</span><span style="color: #000000">0</span><span style="color: #000000">];&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{K&nbsp;</span><span style="color: #000000">-=</span><span style="color: #000000">&nbsp;S0;&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].c[</span><span style="color: #000000">1</span><span style="color: #000000">];}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;i;<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;mkt(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(l&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;r)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Q[front],&nbsp;mid&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;r&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(front&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;MAXN)&nbsp;front&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;front</span><span style="color: #000000">++</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;newnode(n0,&nbsp;a[mid]);&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l_r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mkt(l,&nbsp;mid&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">),&nbsp;r_r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mkt(mid&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;r);<br />&nbsp;&nbsp;&nbsp;&nbsp;sc(n0,&nbsp;l_r,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;sc(n0,&nbsp;r_r,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;upd(n0);&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;n0;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ins(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;pos)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(pos);&nbsp;splay(P0,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(pos&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;splay(P1,&nbsp;root);&nbsp;sc(P1,&nbsp;mkt(</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;len&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">),&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;upd(P1);&nbsp;upd(P0);<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;era(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">x)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(rear&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;MAXN)&nbsp;rear&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;rear</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;Q[rear]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x;<br />&nbsp;&nbsp;&nbsp;&nbsp;era(T[x].c[</span><span style="color: #000000">0</span><span style="color: #000000">]);&nbsp;era(T[x].c[</span><span style="color: #000000">1</span><span style="color: #000000">]);<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;del(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(l&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;splay(P0,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(r&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;splay(P1,&nbsp;root);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;root0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[P1].c[</span><span style="color: #000000">0</span><span style="color: #000000">];&nbsp;sc(P1,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;upd(P1);&nbsp;upd(P0);&nbsp;era(root0);<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;mksame(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(l&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;splay(P0,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(r&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;splay(P1,&nbsp;root);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[P1].c[</span><span style="color: #000000">0</span><span style="color: #000000">];&nbsp;T[n].sm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x;&nbsp;sm_opr(n,&nbsp;x);&nbsp;upd(P1);&nbsp;upd(P0);<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;reve(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(l&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;splay(P0,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(r&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;splay(P1,&nbsp;root);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[P1].c[</span><span style="color: #000000">0</span><span style="color: #000000">];&nbsp;T[n].rev&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">T[n].rev;&nbsp;rev_opr(n);&nbsp;upd(P1);&nbsp;upd(P0);<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;get_sum(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(l&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;splay(P0,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(r&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;splay(P1,&nbsp;root);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[P1].c[</span><span style="color: #000000">0</span><span style="color: #000000">];&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;T[n].sum;<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;max_sum()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;T[root].midmax;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;prepare()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;T[</span><span style="color: #000000">0</span><span style="color: #000000">].sz&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[</span><span style="color: #000000">0</span><span style="color: #000000">].sum&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[</span><span style="color: #000000">0</span><span style="color: #000000">].lmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[</span><span style="color: #000000">0</span><span style="color: #000000">].rmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[</span><span style="color: #000000">0</span><span style="color: #000000">].midmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;front&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">;&nbsp;rear&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;MAXN;&nbsp;re1(i,&nbsp;MAXN)&nbsp;Q[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;newnode(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">INF);&nbsp;newnode(</span><span style="color: #000000">2</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">INF);&nbsp;sc(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;root&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;T[root].p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;freopen(</span><span style="color: #000000">"</span><span style="color: #000000">sequence.in</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">r</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;stdin);<br />&nbsp;&nbsp;&nbsp;&nbsp;freopen(</span><span style="color: #000000">"</span><span style="color: #000000">sequence.out</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">w</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;stdout);<br />&nbsp;&nbsp;&nbsp;&nbsp;prepare();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;m,&nbsp;l,&nbsp;r,&nbsp;x;<br />&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">len,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">m);&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;ch&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getchar(),&nbsp;str[</span><span style="color: #000000">1000</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;len)&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">a[i]);&nbsp;ins(</span><span style="color: #000000">1</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;m)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%s</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;str);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">strcmp(str,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">INSERT</span><span style="color: #000000">"</span><span style="color: #000000">))&nbsp;{scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">l,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">len);&nbsp;re(i,&nbsp;len)&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">a[i]);&nbsp;ins(</span><span style="color: #000000">++</span><span style="color: #000000">l);}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">strcmp(str,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">DELETE</span><span style="color: #000000">"</span><span style="color: #000000">))&nbsp;{scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">l,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">r);&nbsp;r&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;l</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;del(l,&nbsp;r);}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">strcmp(str,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">MAKE-SAME</span><span style="color: #000000">"</span><span style="color: #000000">))&nbsp;{scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">l,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">r,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">x);&nbsp;r&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;l</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;mksame(l,&nbsp;r,&nbsp;x);}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">strcmp(str,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">REVERSE</span><span style="color: #000000">"</span><span style="color: #000000">))&nbsp;{scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">l,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">r);&nbsp;r&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;l</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;reve(l,&nbsp;r);}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">strcmp(str,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">GET-SUM</span><span style="color: #000000">"</span><span style="color: #000000">))&nbsp;{scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">l,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">r);&nbsp;r&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;l</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;get_sum(l,&nbsp;r));}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">strcmp(str,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">MAX-SUM</span><span style="color: #000000">"</span><span style="color: #000000">))&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;max_sum());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getchar();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;fclose(stdin);&nbsp;fclose(stdout);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /></span></div><br />最后把我的这个代码与BYVoid神犇的本题代码进行测试比较，结果（BYVoid神犇的代码见<a title="这里" href="http://www.byvoid.com/blog/noi-2005-sequence/">这里</a>）：<br /><br />BYVoid神犇的：<br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/matono1/测评结果/BYVoid_Sequence.jpg" width="295" longdesc="" height="166" /><br /><br />本沙茶的：<br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/matono1/测评结果/Mato_No1_Sequence.jpg" width="291" longdesc="" height="166" /><br /><br />【相关论文】<br /><a title="运用伸展树解决数列维护问题" href="http://wenku.baidu.com/view/db0f77661ed9ad51f01df23f.html">运用伸展树解决数列维护问题</a>&nbsp;by JZP<br />【感谢】<br />JZP神犇（提供论文）<br />BYVoid神犇（提供标程）<br /></div><img src ="http://www.cppblog.com/MatoNo1/aggbug/149121.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2011-06-21 16:06 <a href="http://www.cppblog.com/MatoNo1/archive/2011/06/21/149121.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Splay Tree 重复次数mul以及一些进阶操作</title><link>http://www.cppblog.com/MatoNo1/archive/2011/06/21/149067.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Tue, 21 Jun 2011 03:31:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2011/06/21/149067.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/149067.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2011/06/21/149067.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/149067.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/149067.html</trackback:ping><description><![CDATA[额&#8230;&#8230;最近两天光顾着刷题忘了总结了&#8230;&#8230;正好现在把总结的东东全部补上吧囧&#8230;&#8230;<br /><br />【重复次数mul】<br />在前面第一篇总结Splay Tree的时候就提到了结点的重复次数(mul)域，这个东东至今在网上还米看见有犇用（在本沙茶见过的范围内），但是不可否认的是这个域在某些情况下几乎是&#8220;必须使用&#8221;的。<br />所谓重复次数，就是将树中所有值(v)相同的结点全部合并成一个，这些结点的总个数就是合并后的结点的mul值。比如，在一棵空树中插入3个值为5的结点后，在使用mul域的情况下，树中只有一个结点，其v值为5，mul值为3。<br />在平衡树中，值相同的结点确实非常碍事。按照二叉查找树的定义：&#8220;要么是一棵空树，要么是一棵满足以下条件的非空树：根结点左子树中所有结点的值均小于根结点，根结点右子树中所有结点的值均大于根结点，且根的左右子树均为二叉查找树&#8221;，在二叉查找树中，是不应该出现值相同的结点的。可是在实际问题中，出现值相同的结点几乎是不可避免的。此时，树的定义就会变得非常模糊，也就是要把二叉查找树定义中的&#8220;小于&#8221;全部改为&#8220;小于等于&#8221;，&#8220;大于&#8221;全部改为&#8220;大于等于&#8221;。这样定义的树在一般情况下也米有神马问题，但是在找前趋(Pred)和找后继(Succ)操作中，问题就来了。因为根结点的前趋和后继的值可能与根结点相等（比如 HNOI2004 宠物收养所 那一题），这时，根结点的前趋既有可能在左子树里，也有可能在右子树里，根结点的后继也一样。此时，这两个操作就无法进行了。 <br />【mul域的维护】<br />mul域其实可以看成结点的一个本身属性，和v一样。因此在旋转、伸展操作中任何结点的mul值都是不会改变的。可能改变结点mul值的地方只有两处：一是插入，二是删除。在插入一个值为_v的结点的时候，如果发现值为_v的结点在树中已经存在，则只会将这个结点的mul值加1，而不是真正插入一个新的结点。同样的，在删除一个结点的时候，如果这个结点的mul值大于1，则只会将这个结点的mul值减1，而不是真正删除。<br />【mul域的作用】<br />mul域最主要的作用就是解决值相同的结点对于某些操作的影响。另外，mul域的引入可以减少树中结点的总个数（尤其是当插入的结点数很多而结点的值的范围不大的时候），从而降低时间复杂度（准确来说可以降低常数）。<br />【Splay Tree的进阶操作】<br />&lt;1&gt;找非根结点的前趋和后继。<br />Splay Tree由于有伸展操作，可以将要求前趋或后继的点伸展到根再求前趋或后继。如果要不通过伸展操作找一个非根结点的前趋或后继怎么办？<br />设这个结点为x。如果x有左子结点，则x的前趋就是x的左子结点的右链上的最后一个结点；如果x没有左子结点，则x的前趋就是从x开始往上（往x的祖先）查找，直到找到第一个是其父结点的右子结点的结点为止，则这个结点的父结点就是x的前趋（或者说，就是不断沿着x的父结点往上找，一开始都是往右的，找到第一个往左的就行了）。后继则正好相反。证明可以用中序遍历。<br />&lt;2&gt;找某个值v0的前趋和后继（值为v0的结点在树中不一定存在）。<br />所谓v0的前趋和后继，就是指在树中值小于（也有的是不大于）v0的最大的结点的值，和树中值大于（也有的是不小于）v0的最小的结点的值。在有了操作（1）【不通过伸展操作找非根结点的前趋和后继】以后，这个操作变得极为容易：先进行普通的查找操作（查找值为v0的结点），如果能找到，则剩下的步骤就和操作（1）一样了；如果找不到，则必然是找到某个空结点（0）处，假设在这里插入一个值为v0的结点（只是假设，不是真插入），则该结点显然是没有左子结点的，因此就是&#8220;从该结点开始往上查找，直到找到第一个是其父结点的右子结点的结点为止，则这个结点的父结点就是该结点的前趋&#8221;，也就是v0的前趋；后继类似。<br />在查找过程中可以进行一个常数优化：设点i为查找过程中&#8220;右转&#8221;的最后一个结点（即找到该结点后，接下来是该结点的右子结点），每次往右子结点转的时候就更新i，则最后结点i就是值v0的前趋；后继类似。<br />&lt;3&gt;删除所有值在某区间内的结点（这个区间可以是开区间、闭区间或半开半闭区间）。<br />以开区间为例：删除树中所有值在(l, r)范围内的结点。先找到l的前趋P和r的后继S（注意这里的前趋和后继是包括&#8220;等于&#8221;的），然后将P伸展到根，S伸展到P的右子结点处，则S的左子树中就是所有值在(l, r)范围内的结点，直接删掉这棵子树即可（注意删除后要更新S和P）；若改为闭区间，则将前趋和后继中的&#8220;等于&#8221;去掉（即必须是小于或大于）；半开半闭区间则一半按开区间处理，一半按闭区间处理。问题是，如果点P或点S不存在怎么办。有两种解决办法，一是若P和S之一存在，则将其伸展到根，然后直接删掉其左子树或右子树即可；若P和S都不存在，则树为空，直接将root置为0即可；二是按照sequence的办法，加入两个边界结点，当前趋或后继不存在时就认为是边界结点。<br />其实不光是删除，在找到了这棵子树后可以对它进行一些整体操作，从而让Splay Tree具有线段树的功能（这个在下面的NOI2005 sequence那一题里面会总结）。<br />&lt;4&gt;插入一棵树（当然这棵树也是Splay Tree，并且原树中的结点值序列与新树中的结点值序列不相交）。<br />有时候，题目中会连续出现很多插入操作，中间没有其它操作，此时，与其一个一个插入，还不如将它们先建成一棵树（建树的方法在下一篇里总结），再整体插入。整体插入的方法：设L和R分别是新树里值最小的结点和值最大的结点，在原树中找到L的前趋P和R的后继S，将P伸展到根，S伸展到P的右子结点处，由于原树中的结点值序列与新树中的结点值序列不相交（也就是原树中的结点值要么小于L的值，要么大于R的值），因此S无左子结点，此时将新树作为S的左子树即可。<br /><img src ="http://www.cppblog.com/MatoNo1/aggbug/149067.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2011-06-21 11:31 <a href="http://www.cppblog.com/MatoNo1/archive/2011/06/21/149067.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>终于摘掉了不会平衡树的帽子</title><link>http://www.cppblog.com/MatoNo1/archive/2011/06/18/148934.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sat, 18 Jun 2011 13:21:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2011/06/18/148934.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/148934.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2011/06/18/148934.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/148934.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/148934.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 今天真是有纪念意义啊&#8230;&#8230;以前试着捉了N遍的cashier今天竟然AC了，本沙茶终于掌握了平衡树！！！【Splay Tree及其实现】&lt;1&gt;结点记录的信息：一般情况下Splay Tree是用线性存储器（结构数组）来存储的，可以避免在Linux下的指针异常问题。这样对于某个结点，至少要记录以下的域：值（又叫关键字）、左子结点的下标、右子结点的下标、父结点下标、子树大...&nbsp;&nbsp;<a href='http://www.cppblog.com/MatoNo1/archive/2011/06/18/148934.html'>阅读全文</a><img src ="http://www.cppblog.com/MatoNo1/aggbug/148934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2011-06-18 21:21 <a href="http://www.cppblog.com/MatoNo1/archive/2011/06/18/148934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>