﻿<?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/16701.html</link><description>Mato是一只超级大沙茶……但他一直以来都想成为各项比赛都No.1的神犇……</description><language>zh-cn</language><lastBuildDate>Sat, 14 Sep 2013 10:10:41 GMT</lastBuildDate><pubDate>Sat, 14 Sep 2013 10:10:41 GMT</pubDate><ttl>60</ttl><item><title>统计的力量</title><link>http://www.cppblog.com/MatoNo1/archive/2013/09/13/203211.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Fri, 13 Sep 2013 05:29:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2013/09/13/203211.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/203211.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2013/09/13/203211.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/203211.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/203211.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Orz zkw！！！最近看完了《统计的力量》&#8230;&#8230;觉得这实在是太神了&#8230;&#8230;原来线段树可以这么写&#8230;&#8230;zkw线段树的思想：先将线段长度N变为2的整数次方，使线段树成为满二叉树，然后就可以通过各种位运算直接链接到某个结点，不必递归了，因此大大减小了常数&#8230;&#8230;本沙茶利用zkw线段树在BZOJ1756和1798上都刷到...&nbsp;&nbsp;<a href='http://www.cppblog.com/MatoNo1/archive/2013/09/13/203211.html'>阅读全文</a><img src ="http://www.cppblog.com/MatoNo1/aggbug/203211.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> 2013-09-13 13:29 <a href="http://www.cppblog.com/MatoNo1/archive/2013/09/13/203211.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【AHOI2013复仇】两道有关删边后最短路径维护的猥琐题</title><link>http://www.cppblog.com/MatoNo1/archive/2013/01/19/197399.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sat, 19 Jan 2013 08:49:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2013/01/19/197399.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/197399.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2013/01/19/197399.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/197399.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/197399.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 【先祝贺一下@Jollwish神犇进入CMO国家集训队&#8230;&#8230;合肥OI人总算出了个国家集训队员（虽然不是OI的）&#8230;&#8230;】最近捉了两道猥琐题&#8230;&#8230;都是有关图中删去某边后的最短路径的问题&#8230;&#8230;核心思想几乎相同&#8230;&#8230;但是，它们很明显是综合题，代码量太大了（与NOIP2012的drive和block...&nbsp;&nbsp;<a href='http://www.cppblog.com/MatoNo1/archive/2013/01/19/197399.html'>阅读全文</a><img src ="http://www.cppblog.com/MatoNo1/aggbug/197399.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> 2013-01-19 16:49 <a href="http://www.cppblog.com/MatoNo1/archive/2013/01/19/197399.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【AHOI2013复仇】关于线段树下标的一种优化表示法</title><link>http://www.cppblog.com/MatoNo1/archive/2012/12/01/195857.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sat, 01 Dec 2012 04:11:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2012/12/01/195857.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/195857.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2012/12/01/195857.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/195857.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/195857.html</trackback:ping><description><![CDATA[在线段树中，一般都不需要刻意保存其左右子结点的下标，而直接由其本身的下标导出，传统的写法是：<br />根结点：1<br />A的左子结点：2A（写成A&lt;&lt;1）<br />A的右子结点：2A+1（写成(A&lt;&lt;1)+1）<br />这种表示法可以表示出整棵线段树，因为：<br />（1）每个结点的子结点的下标都比它大，这样就不会出现环；<br />（2）每个结点的父结点都是唯一的（其本身下标整除2）；<br />但是，这种表示法有一个弱点：结点的下标是有可能超过2N的，但不会超过4N，因此，为了表示出跨度为N的线段，我们需要开4N的空间，然而，其中只有2N-1个位置是有用的（因为表示跨度为N的线段的线段树共有(2N-1)个结点），<span style="color: red"><strong>这样，就有一半的空间被浪费</strong></span>。尤其是这种线段树推广到多维的时候&#8212;&#8212;K维线段树就只有1/2<sup>K</sup>的位置是有用的，空间利用率非常低。在某些卡空间的场合，它就囧掉了。<br /><br />那么，有木有好一点的写法呢？最好能使空间利用率达到100%&#8212;&#8212;也就是所有结点的下标刚好就是1~(2N-1)！！（0号结点一般作为&#8220;哨兵&#8221;，不被占用）<br />并且，这种写法要保证仅仅由结点的下标和它表示的线段的左右端点（因为在遍历线段时，下标和左右端点基本上都是同时知道的），就能得出其子结点的下标，而不需要借助额外的东东（最好mid都不需要算）。<br />这种写法就是&#8212;&#8212;<strong><span style="color: red">直接将每个结点的DFS遍历次序当做它的下标！！</span><br /></strong>比如，跨度为6的线段树：<br /><img alt="" src="http://www.cppblog.com/images/cppblog_com/matono1/描述所用图片/新式线段树.jpg" border="0" height="200" width="235" /><br />容易发现，根结点下标为1，下标为A的结点的左子结点下标为(A+1)，右子结点下标为A+SZ(A.L)+1，其中SZ(A.L)为A的左子树大小。<br />若A的左右端点为l、r，mid=(l+r)/2（下取整），则A的左子树所表示的线段为[l, mid]，所以SZ(A.L)=(mid-l+1)*2-1=(mid-l)*2+1=((r-l-1)/2（上取整）)*2+1<br />这样，A的右子结点下标就是A+((r-l+1)/2（上取整))*2，也就是<span style="color: red"><strong>A加上大于(r-l)的最小的偶数</strong></span>；<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: #0000ff">int</span><span style="color: #000000">&nbsp;mid</span><span style="color: #000000">=</span><span style="color: #000000">l</span><span style="color: #000000">+</span><span style="color: #000000">r</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />opr(l,&nbsp;mid,&nbsp;A</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">);<br />opr(mid</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;r,&nbsp;(r</span><span style="color: #000000">-</span><span style="color: #000000">l</span><span style="color: #000000">&amp;</span><span style="color: #000000">1</span><span style="color: #000000">?</span><span style="color: #000000">A</span><span style="color: #000000">+</span><span style="color: #000000">r</span><span style="color: #000000">-</span><span style="color: #000000">l</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">:A</span><span style="color: #000000">+</span><span style="color: #000000">r</span><span style="color: #000000">-</span><span style="color: #000000">l</span><span style="color: #000000">+</span><span style="color: #000000">2</span><span style="color: #000000">));</span></div>或者，借助位运算，可以免去条件判断： 
<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: #0000ff">int</span><span style="color: #000000">&nbsp;mid</span><span style="color: #000000">=</span><span style="color: #000000">l</span><span style="color: #000000">+</span><span style="color: #000000">r</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />opr(l,&nbsp;mid,&nbsp;A</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">);<br />opr(mid</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;r,&nbsp;A</span><span style="color: #000000">+</span><span style="color: #000000">r</span><span style="color: #000000">-</span><span style="color: #000000">l</span><span style="color: #000000">+</span><span style="color: #000000">2</span><span style="color: #000000">-</span><span style="color: #000000">((r</span><span style="color: #000000">^</span><span style="color: #000000">l)</span><span style="color: #000000">&amp;</span><span style="color: #000000">1</span><span style="color: #000000">));</span></div>经测试，后者（使用位运算的）虽然总的运算次数多于前者（使用条件判断的），但后者比前者快一点点，其原因可能与C语言中的条件运算符速度较慢有关；<br /><br />这样，我们就成功地将线段树下标的空间利用率提高到了100%！！以后只需要开2N空间就行了囧&#8230;&#8230;<br />与传统表示法相比，这种新式表示法虽然可以节省空间，但时间消耗要更大一些（时间和空间总是矛盾的囧&#8230;&#8230;），因为它在找右子结点的时候需要较多的运算。平均起来，新式表示法比传统表示法要慢10~15%，对于某些坑爹的数据（对右子结点调用比较多的那种）可能慢得更多。此外，在下放标记的时候，传统表示法只需要知道结点下标就行了，而新式表示法必须同时知道结点的左右端点，这样在dm中就需要传递三个参数，从而要慢一些，当然，我们可以不用dm，直接在操作里面写标记下放。<img src ="http://www.cppblog.com/MatoNo1/aggbug/195857.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-12-01 12:11 <a href="http://www.cppblog.com/MatoNo1/archive/2012/12/01/195857.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><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>线段树操作极品题——HDU2871</title><link>http://www.cppblog.com/MatoNo1/archive/2011/12/18/162313.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sun, 18 Dec 2011 00:58:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2011/12/18/162313.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/162313.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2011/12/18/162313.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/162313.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/162313.html</trackback:ping><description><![CDATA[<div><a title="原题地址" href="http://acm.hdu.edu.cn/showproblem.php?pid=2871">原题地址</a><br />这是一道线段树操作的极品题，因为它的4个操作刚好覆盖了线段树操作问题的3种处理思路，可以说是把线段树操作的全部内容都包含进去了。<br /><br />线段树是一种静态的数据结构，因为一棵线段树一旦建成，其形态就永远不会发生变化，改变的仅仅是结点上记录的各种信息的值。因此，对于线段树操作，核心问题也就是如何维护和处理这些信息。总的来说，对于线段树结点信息的维护和处理，有以下3种基本思路：<br />（1）左右归中型：<br />所谓左右归中，就是用左右子结点存储的信息来得到父结点存储的信息的值，这是最常见的线段树维护方法。举一些简单的例子：比如结点的SUM域表示该结点区间上所有元素的和，那么这个域维护的方法就是&#8220;父结点SUM=左子结点SUM+右子结点SUM&#8221;，再比如结点的MAX/MIN域表示该结点区间上所有元素的最大/小值，那么维护方法就是&#8220;父结点MAX/MIN=max/min{左子结点MAX/MIN,右子结点MAX/MIN}&#8221;。这种维护方法也比较简单，只要在每次对子结点进行修改之后upd一下就行了（对于那些自顶向下递归，而且涉及到改值的操作，在递归完左右子结点后一定要记得upd一下），在这之中有一个很重要的思想就是&#8220;左右连续段&#8221;思想：如果题目中要求任意一个区间内的具有某种性质的最长的连续序列（也就是子区间），比如最长连续上升子序列、01值问题中连续的0段或者非0段（在具体问题中就是连续的空闲段或者占用段）等，可以在每个结点上维护三个域：lS、rS和S，分别表示该结点区间左端（从区间的最左端开始的）具有这种性质的最长连续序列的长度，该结点区间右端（到区间的最右端结束的）具有这种性质的最长连续序列的长度和该区间内具有这种性质的最长连续序列的长度（也就是要求的那个东东），则维护方法为&#8220;父结点lS=左子结点lS（左子结点lS&lt;左子结点len）或左子结点len+右子结点lS（左子结点lS=左子结点len），父结点rS类似，父结点S=max{左子结点S,右子结点S,左子结点rS+右子结点lS}&#8221;，此外，由于要求的这个区间可能被拆成多个连续的结点区间，因此需要按顺序合并这些区间，合并的方法是：设立S0和S1，S0表示不保证能延伸下去的区间长度，S0=上一个区间的S1+本区间的lS；S1表示可以延伸下去的区间长度，S1=上一个区间的S1+本区间len（如果本区间整个都是满足条件的，即S=len）或本区间的rS（本区间不都是满足条件的，即S&lt;len），取过程中所有S0和区间S的最大值即为结果。<br />在HDU2871中，应用左右归中的方法维护的信息就是&#8220;最长连续空闲段&#8221;的长度，New操作需要；<br /><br />（2）调整边界型：<br />考虑这样一个问题：现在要插入、删除一些[0, 100000)的整数，并且在此过程中不断询问第K小的整数是多少，怎么办？平衡树可以实现，但线段树显然是更好的方法。对每个结点，存储一个K0值表示位于该结点区间内的整数的个数，则查找第K小的时候只需要不断执行以下操作：Kth(A, K)，表示在结点A代表的区间内找第K小的，然后，若K&lt;=结点A的左子结点K0值，则执行Kth(A的左子结点, K)，否则执行Kth(A的右子结点, K-A左子结点的K0)（这和平衡树神似），直到找到叶结点为止。这种方法称为&#8220;调整边界型&#8221;，即随着结点深入，不断缩小（自顶向下）或扩大（自底向上）范围，最后找到结果。像找第K小这样的操作属于自顶向下型，而像&#8220;找到X所在的具有某种性质的最长的连续区间&#8221;就属于自底向上型（注意和本题的Free不一样）；<br /><br />（3）标记辅助型：<br />这种维护信息的方法，特点是利用标记来维护信息，即对于某些结点（主要是叶结点，因为其标记不再下放），直接使用标记来得到一些数据，比如对于HDU2871这一题，其中对于叶结点位于的插入线段的标号，使用的就是标记。<br /><br />下面是本题4个操作的具体实现：<br />&lt;1&gt;线段树结点定义：<br />本题需要两棵线段树，这是因为New与Free操作对于tot域（插入线段左端点的总个数）会造成不同的影响，具体来说，在New操作中，tot值不会被同时加上（需要另外一个操作加上），然而在Free操作中，tot值会被同时清空，这样就会导致在对某个结点清空（该结点包含在某个Free操作要清空的线段中）并打上0标记之后，如果紧接着又插入一条包含这个结点区间的新线段，则这个结点的0标记就会丧失，这样在紧接着下传的时候，其子结点的tot值就不会被清空（事实上已经被清空了）。所以，将tot域彻底转移到另一棵线段树里。 
<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: #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;len,&nbsp;mr,&nbsp;lsc,&nbsp;rsc,&nbsp;sc;<br />}&nbsp;T[MAXN&nbsp;</span><span style="color: #000000">&lt;&lt;</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;node0&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;tot;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;mr;<br />}&nbsp;T0[MAXN&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">];</span></div>其中lsc、rsc、sc就是连续空闲段的长度（用左右归中的方法维护），mr是一个整体赋值标记，在T中，mr的值若为-1表示无标记（未被整体赋值），若为0表示被整体清空，若大于0表示整体被一条线段覆盖，mr值就是这条线段的编号（为区分不同线段，这里按照输入顺序对每一条New操作插入的线段以1、2&#8230;&#8230;编号），在T0中，mr=1表示在Reset中被整体清空，mr=0表示无标记。<br />&lt;2&gt;操作处理：<br />1)Reset操作：将T、T0的根结点打上清空标记即可；<br />2)New：涉及到两个操作，分别是找最左的长度为x的连续空闲段，以及插入一条线段。对于前者，可以根据lsc、rsc、sc的值，按照&#8220;先左子结点，再跨越两个子结点，最后右子结点&#8221;的顺序求得（详见代码）；对于后者就不用说了，太容易实现了（注意标记的处理以及upd，另外要插入一个tot）；<br />3)Free：也涉及两个操作，分别是找一个点x所在的线段（插入过的线段）长度以及删除一条线段，对于前者可将New插入过的所有线段的左右端点预存起来，然后找到代表区间[x, x]的结点的mr值（也就是结点x被编号为神马的线段覆盖），再在预存的线段中找到即可。对于后者，直接清空即可（不要在T0中打标记，而要单独删除一个tot）；<br />4)Get：直接利用T0中的tot找到第K小的值即可；<br /><br /><a title="代码" href="http://www.ideone.com/LBj8f">代码</a></div><img src ="http://www.cppblog.com/MatoNo1/aggbug/162313.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-12-18 08:58 <a href="http://www.cppblog.com/MatoNo1/archive/2011/12/18/162313.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>线段树+扫描法解决矩形的面积并、周长并问题</title><link>http://www.cppblog.com/MatoNo1/archive/2011/07/02/149965.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sat, 02 Jul 2011 03:17:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2011/07/02/149965.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/149965.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2011/07/02/149965.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/149965.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/149965.html</trackback:ping><description><![CDATA[<p>矩形的面积并问题：平面上有N个矩形，各边均平行于坐标轴，求它们覆盖的总面积（重复覆盖的只计一次）。<br />矩形的周长并问题：平面上有N个矩形，各边均平行于坐标轴，求它们覆盖形成的多边形的周长。<br /><br />【算法】<br />面积并：<br />先将所有矩形的上边界和下边界作为水平线段记录下来，并对所有矩形的左右边界对应的横坐标离散化，设离散化后有N个横坐标，则中间有(N-1)段。对这(N-1)段建立线段树（注意，仍然和普通线段树一样，是双闭区间，不是网上说的一开一闭），然后，按照纵坐标递增顺序扫描前面记录的水平线段（设有M段），对每一段，如果是上边界，找到其离散化后的范围（只需找到其左右端点离散化后的值l、r，则对应范围为[l, r-1]），并插入线段[l, r-1]，否则（下边界），删除线段[l, r-1]。再然后，线段树中的每个结点需要记录该区间内的线段覆盖的总长度len（若该区间被某条尚未删除的线段整体覆盖，则len=总长，否则len=左右子结点len之和），每次操作后，累加面积：T[root].len*该水平线段与下一条水平线段的纵坐标之差。<br /><br />周长并：<br />类似，只不过由于组成周长的线段有水平的也有竖直的，线段树结点要记录的除了len意外还有一个ss，表示被线段覆盖的端点数量。另外还有lr和rr两个bool值，分别表示该线段的左端点和右端点是否被某条插入的线段覆盖。则T[x].ss = lch(T[x]).ss + rch(T[x]).ss - 2 * (lch(T[x]).rr &amp;&amp; rch(T[x].lr))，若该线段被整体覆盖则T[x].ss=2（两端点）。最后，这次得到的T[root].len与上次得到的T[root].len之差的绝对值就是水平线段的长度，T[root].ss*纵坐标之差就是竖直线段的长度。<br /><br /></p><img src ="http://www.cppblog.com/MatoNo1/aggbug/149965.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-02 11:17 <a href="http://www.cppblog.com/MatoNo1/archive/2011/07/02/149965.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>【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>动态区间最大子序和问题及有关模型</title><link>http://www.cppblog.com/MatoNo1/archive/2011/04/24/144901.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sun, 24 Apr 2011 07:50:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2011/04/24/144901.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/144901.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2011/04/24/144901.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/144901.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/144901.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 动态区间最大子序和问题【问题描述】给出一个序列A[0..N-1]和M个操作，每个操作都是以下三种之一：①：查询区间最大子序和操作格式：1 l r表示：查询A[l..r]内的最大子序和（就是A[l..r]内的和最大的连续子序列的和），0&lt;=l&lt;=r&lt;N；②：修改单个值操作格式：2 i&nbsp;x表示：将A[i]的值改为x，0&lt;=i&lt;N；③：修改整段值操作格式：3 l ...&nbsp;&nbsp;<a href='http://www.cppblog.com/MatoNo1/archive/2011/04/24/144901.html'>阅读全文</a><img src ="http://www.cppblog.com/MatoNo1/aggbug/144901.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-04-24 15:50 <a href="http://www.cppblog.com/MatoNo1/archive/2011/04/24/144901.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>