<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on SHENXN</title><link>https://www.sxn.dev/posts/</link><description>Recent content in Posts on SHENXN</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><copyright>&lt;a href="https://creativecommons.org/licenses/by-nc/4.0/" target="_blank" rel="noopener">CC BY-NC 4.0&lt;/a></copyright><lastBuildDate>Thu, 22 May 2014 12:50:09 +0000</lastBuildDate><atom:link href="https://www.sxn.dev/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>[POJ2195]Going Home（KM算法）</title><link>https://www.sxn.dev/posts/poj2195/</link><pubDate>Thu, 22 May 2014 12:50:09 +0000</pubDate><guid>https://www.sxn.dev/posts/poj2195/</guid><description>&lt;p>就是一道KM的模板题，而且建图已经非常显然了。关于KM算法：&lt;/p>
&lt;blockquote>
&lt;p>KM算法流程：&lt;/p>
&lt;p>(1)初始化可行顶标值&lt;/p>
&lt;p>(2)用匈牙利算法寻找完备匹配&lt;/p>
&lt;p>(3)若未找到完备匹配则修改可行顶标的值&lt;/p>
&lt;p>(4)重复(2)(3)直到找到相等子图的完备匹配为止
上述内容转自：&lt;a href="http://www.360doc.com/content/11/0718/14/3701281_134273282.shtml">二分图匹配算法总结(phoenixinter)&lt;/a>，更详细的讲述详见原文。&lt;/p>
&lt;/blockquote></description><content type="html"><![CDATA[<p>就是一道KM的模板题，而且建图已经非常显然了。关于KM算法：</p>
<blockquote>
<p>KM算法流程：</p>
<p>(1)初始化可行顶标值</p>
<p>(2)用匈牙利算法寻找完备匹配</p>
<p>(3)若未找到完备匹配则修改可行顶标的值</p>
<p>(4)重复(2)(3)直到找到相等子图的完备匹配为止
上述内容转自：<a href="http://www.360doc.com/content/11/0718/14/3701281_134273282.shtml">二分图匹配算法总结(phoenixinter)</a>，更详细的讲述详见原文。</p>
</blockquote>
<p>但是KM算法找的是最大权值，而本题要求的是最小权值。很多题解上都说把权值取反，然后最后再取反输出。但我总觉得这样做不舒服。其实也很简单，接上述文章的描述，先初始化X的可行顶标为X出发的所有边的权值的最小值，而松弛变量slack(yj) = min{w(xi, yj) - l(xi) - l(yj), |xi in S, yj not int T}，每次修改顶标时，将所有在S中的l(xi)加delta，所有在T中的l(yj)减小delta。此时要记得将所有的slack值加上delta（每次初始化也可以，复杂度上没差太多）。</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#75715e">//POJ 2195.cpp
</span><span style="color:#75715e"></span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;algorithm&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;iostream&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstring&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdlib&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdio&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;string&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;vector&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cmath&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;queue&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;stack&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;map&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;set&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span>
<span style="color:#75715e">//#define LOCAL
</span><span style="color:#75715e">//#define READ_FILE
</span><span style="color:#75715e"></span><span style="color:#75715e">#define READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define VISUAL_STUDIO
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXN <span style="color:#f92672">=</span> <span style="color:#ae81ff">110</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXPT <span style="color:#f92672">=</span> <span style="color:#ae81ff">210</span>;

<span style="color:#75715e">#ifdef LOCAL
</span><span style="color:#75715e">#define LOCAL_TIME
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define LOCAL_DEBUG
</span><span style="color:#75715e">//#define STD_DEBUG
</span><span style="color:#75715e"></span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;ctime&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef VISUAL_STUDIO
</span><span style="color:#75715e">#pragma warning(disable: 4996)
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#66d9ef">char</span> fread_char;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">fread_init</span>()
{
	fread_char <span style="color:#f92672">=</span> getchar();
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">get_int</span>()
{
	<span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
	<span style="color:#66d9ef">while</span> ((fread_char <span style="color:#f92672">&lt;</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">||</span> (fread_char <span style="color:#f92672">&gt;</span> <span style="color:#e6db74">&#39;9&#39;</span>))
	{
		fread_char <span style="color:#f92672">=</span> getchar();
	}
	<span style="color:#66d9ef">while</span> ((fread_char <span style="color:#f92672">&gt;=</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (fread_char <span style="color:#f92672">&lt;=</span> <span style="color:#e6db74">&#39;9&#39;</span>))
	{
		ret <span style="color:#f92672">=</span> ret <span style="color:#f92672">*</span> <span style="color:#ae81ff">10</span> <span style="color:#f92672">+</span> fread_char <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;0&#39;</span>;
		fread_char <span style="color:#f92672">=</span> getchar();
	}
	<span style="color:#66d9ef">return</span> ret;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">char</span> <span style="color:#a6e22e">get_char</span>()
{
	<span style="color:#66d9ef">char</span> ret;
	<span style="color:#66d9ef">while</span> ((fread_char <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39; &#39;</span>) <span style="color:#f92672">||</span> (fread_char <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;n&#39;</span>))
	{
		fread_char <span style="color:#f92672">=</span> getchar();
	}
	ret <span style="color:#f92672">=</span> fread_char;
	fread_char <span style="color:#f92672">=</span> getchar();
	<span style="color:#66d9ef">return</span> ret;
}
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">read</span>(<span style="color:#66d9ef">int</span> <span style="color:#f92672">&amp;</span>a)
{
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>	a <span style="color:#f92672">=</span> get_int();
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>	scanf(<span style="color:#e6db74">&#34;%d&#34;</span>, <span style="color:#f92672">&amp;</span>a);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">read</span>(<span style="color:#66d9ef">char</span> <span style="color:#f92672">&amp;</span>a)
{
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>	a <span style="color:#f92672">=</span> get_char();
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>	scanf(<span style="color:#e6db74">&#34;%c&#34;</span>, <span style="color:#f92672">&amp;</span>a);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">man_node</span>
{
	<span style="color:#66d9ef">int</span> x, y;
};

<span style="color:#66d9ef">typedef</span> man_node house_node;

<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">edge_node</span>
{
	<span style="color:#66d9ef">int</span> to;
	<span style="color:#66d9ef">int</span> d;
	edge_node <span style="color:#f92672">*</span>next;
};

edge_node edge[MAXN <span style="color:#f92672">*</span> MAXN];
edge_node <span style="color:#f92672">*</span>head_edge[MAXPT];
<span style="color:#66d9ef">int</span> tot_edge;

man_node man[MAXN];
house_node house[MAXN];
<span style="color:#66d9ef">int</span> tot_man;
<span style="color:#66d9ef">int</span> tot_house;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">add_edge</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> u, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> v, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> d)
{
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>	<span style="color:#75715e">//printf(&#34;ADD_EDGE: M_X M_Y H_X H_Y D: %d %d %d %d %dn&#34;, man[u].x, man[u].y, house[v].x, house[v].y, d);
</span><span style="color:#75715e"></span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>	edge[tot_edge].d <span style="color:#f92672">=</span> d;
	edge[tot_edge].to <span style="color:#f92672">=</span> v;
	edge[tot_edge].next <span style="color:#f92672">=</span> head_edge[u];
	head_edge[u] <span style="color:#f92672">=</span> edge <span style="color:#f92672">+</span> tot_edge<span style="color:#f92672">++</span>;
}

<span style="color:#66d9ef">int</span> n, m;
<span style="color:#66d9ef">char</span> map_pt;
<span style="color:#66d9ef">int</span> slack[MAXN], height_man[MAXN], height_house[MAXN];
<span style="color:#66d9ef">int</span> ans;
<span style="color:#66d9ef">bool</span> visit_man[MAXN], visit_house[MAXN];
<span style="color:#66d9ef">int</span> match_house[MAXN], match_d[MAXN];

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">min</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> a, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> b)
{
	<span style="color:#66d9ef">if</span> (a <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>)
	{
		<span style="color:#66d9ef">return</span> b;
	}
	<span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (b <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>)
	{
		<span style="color:#66d9ef">return</span> a;
	}
	<span style="color:#66d9ef">return</span> a <span style="color:#f92672">&lt;</span> b <span style="color:#f92672">?</span> a : b;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">bool</span> <span style="color:#a6e22e">aug</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> u)
{
	visit_man[u] <span style="color:#f92672">=</span> true;
	<span style="color:#66d9ef">int</span> delta;
	<span style="color:#66d9ef">for</span> (edge_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> head_edge[u]; tmp <span style="color:#f92672">!=</span> NULL; tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>next)
	{
		<span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span>visit_house[tmp<span style="color:#f92672">-&gt;</span>to])
		{
			delta <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>d <span style="color:#f92672">-</span> height_man[u] <span style="color:#f92672">-</span> height_house[tmp<span style="color:#f92672">-&gt;</span>to];
			<span style="color:#66d9ef">if</span> (delta <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>)
			{
				visit_house[tmp<span style="color:#f92672">-&gt;</span>to] <span style="color:#f92672">=</span> true;
				<span style="color:#66d9ef">if</span> ((match_house[tmp<span style="color:#f92672">-&gt;</span>to] <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>) <span style="color:#f92672">||</span> (aug(match_house[tmp<span style="color:#f92672">-&gt;</span>to])))
				{
					match_house[tmp<span style="color:#f92672">-&gt;</span>to] <span style="color:#f92672">=</span> u;
					match_d[tmp<span style="color:#f92672">-&gt;</span>to] <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>d;
					<span style="color:#66d9ef">return</span> true;
				}
			}
			<span style="color:#66d9ef">else</span>
			{
				slack[tmp<span style="color:#f92672">-&gt;</span>to] <span style="color:#f92672">=</span> min(slack[tmp<span style="color:#f92672">-&gt;</span>to], delta);
			}
		}
	}
	<span style="color:#66d9ef">return</span> false;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">init_km</span>()
{
	memset(slack, <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>, <span style="color:#66d9ef">sizeof</span>(slack));
	memset(height_man, <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>, <span style="color:#66d9ef">sizeof</span>(height_man));
	memset(height_house, <span style="color:#ae81ff">0</span>, <span style="color:#66d9ef">sizeof</span>(height_house));
	memset(match_house, <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>, <span style="color:#66d9ef">sizeof</span>(match_house));
	memset(match_d, <span style="color:#ae81ff">0</span>, <span style="color:#66d9ef">sizeof</span>(match_d));
	ans <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
	<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> tot_man; i<span style="color:#f92672">++</span>)
	{
		<span style="color:#66d9ef">for</span> (edge_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> head_edge[i]; tmp <span style="color:#f92672">!=</span> NULL; tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>next)
		{
			height_man[i] <span style="color:#f92672">=</span> min(height_man[i], tmp<span style="color:#f92672">-&gt;</span>d);
		}
	}
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">km</span>()
{
	init_km();
	<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> tot_man; i<span style="color:#f92672">++</span>)
	{
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>		printf(<span style="color:#e6db74">&#34;AUG: %dn&#34;</span>, i);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>		<span style="color:#75715e">//memset(slack, -1, sizeof(slack));
</span><span style="color:#75715e"></span>		<span style="color:#66d9ef">while</span> (<span style="color:#ae81ff">1</span>)
		{
			memset(visit_man, false, <span style="color:#66d9ef">sizeof</span>(visit_man));
			memset(visit_house, false, <span style="color:#66d9ef">sizeof</span>(visit_house));
			<span style="color:#66d9ef">if</span> (aug(i))
			{
				<span style="color:#66d9ef">break</span>;
			}
			<span style="color:#66d9ef">int</span> delta <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
			<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> j <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; j <span style="color:#f92672">&lt;</span> tot_house; j<span style="color:#f92672">++</span>)
			{
				<span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span>visit_house[j])
				{
					delta <span style="color:#f92672">=</span> min(delta, slack[j]);
				}
			}
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>			printf(<span style="color:#e6db74">&#34;DELTA: %dn&#34;</span>, delta);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>			<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> j <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; j <span style="color:#f92672">&lt;</span> tot_man; j<span style="color:#f92672">++</span>)
			{
				<span style="color:#66d9ef">if</span> (visit_man[j])
				{
					height_man[j] <span style="color:#f92672">+=</span> delta;
				}
			}
			<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> j <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; j <span style="color:#f92672">&lt;</span> tot_house; j<span style="color:#f92672">++</span>)
			{
				<span style="color:#66d9ef">if</span> (visit_house[j])
				{
					height_house[j] <span style="color:#f92672">-=</span> delta;
				}
				<span style="color:#66d9ef">else</span>
				{
					slack[j] <span style="color:#f92672">+=</span> delta;
				}
			}
		}
	}
	<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> tot_house; i<span style="color:#f92672">++</span>)
	{
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>		printf(<span style="color:#e6db74">&#34;HOUSE: %d %d MAX: %d %d D: %dn&#34;</span>, house[i].x, house[i].y, man[match_house[i]].x, man[match_house[i]].y, match_d[i]);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>		ans <span style="color:#f92672">+=</span> match_d[i];
	}
	<span style="color:#66d9ef">return</span> ans;
}

<span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>	<span style="color:#66d9ef">long</span> <span style="color:#66d9ef">long</span> start_time_ <span style="color:#f92672">=</span> clock();
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>	freopen(<span style="color:#e6db74">&#34;2195.in&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>, stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>	freopen(<span style="color:#e6db74">&#34;2195.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>	fread_init();
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>	read(n);
	read(m);
	<span style="color:#66d9ef">while</span> (n <span style="color:#f92672">!=</span> <span style="color:#ae81ff">0</span>)
	{
		tot_man <span style="color:#f92672">=</span> tot_house <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
		memset(head_edge, <span style="color:#ae81ff">0</span>, <span style="color:#66d9ef">sizeof</span>(head_edge));
		<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> n; i<span style="color:#f92672">++</span>)
		{
			<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> j <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; j <span style="color:#f92672">&lt;</span> m; j<span style="color:#f92672">++</span>)
			{
				read(map_pt);
				<span style="color:#66d9ef">if</span> (map_pt <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;m&#39;</span>)
				{
					man[tot_man].x <span style="color:#f92672">=</span> i;
					man[tot_man<span style="color:#f92672">++</span>].y <span style="color:#f92672">=</span> j;
				}
				<span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (map_pt <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;H&#39;</span>)
				{
					house[tot_house].x <span style="color:#f92672">=</span> i;
					house[tot_house<span style="color:#f92672">++</span>].y <span style="color:#f92672">=</span> j;
				}
			}
		}
		tot_edge <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
		<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> tot_man; i<span style="color:#f92672">++</span>)
		{
			<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> j <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; j <span style="color:#f92672">&lt;</span> tot_house; j<span style="color:#f92672">++</span>)
			{
				add_edge(i, j, std<span style="color:#f92672">::</span>abs(man[i].x <span style="color:#f92672">-</span> house[j].x) <span style="color:#f92672">+</span> std<span style="color:#f92672">::</span>abs(man[i].y <span style="color:#f92672">-</span> house[j].y));
			}
		}
		printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, km());
		read(n);
		read(m);
	}
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>	printf(<span style="color:#e6db74">&#34;run time: %lld msn&#34;</span>, (clock() <span style="color:#f92672">-</span> start_time_) <span style="color:#f92672">/</span> <span style="color:#ae81ff">1000</span>);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>	fclose(stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>	fclose(stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>	<span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
}
</code></pre></div>]]></content></item><item><title>[BZOJ1189][HNOI2007]紧急疏散evacuate（二分答案 + 最大流）</title><link>https://www.sxn.dev/posts/hnoi2007-evacuate/</link><pubDate>Wed, 21 May 2014 18:17:40 +0000</pubDate><guid>https://www.sxn.dev/posts/hnoi2007-evacuate/</guid><description>&lt;p>做了好几题裸的最大流，来一道稍微不裸一点的（不过这种经典题也没什么好说的），首先题目二分答案，然后用最大流验证是否满流。首先要做一次BFS预处理，预处理出所有的空点到所有门的最短路。做最大流时，首先将源点向所有空位置连一条容量为1的边，将所有的门向汇点连一条容量为时间的边（一开始连了N * M的容量，坑了好久。。），再将所有空点向时间内能到达的门连一条容量为1的边。&lt;/p></description><content type="html"><![CDATA[<p>做了好几题裸的最大流，来一道稍微不裸一点的（不过这种经典题也没什么好说的），首先题目二分答案，然后用最大流验证是否满流。首先要做一次BFS预处理，预处理出所有的空点到所有门的最短路。做最大流时，首先将源点向所有空位置连一条容量为1的边，将所有的门向汇点连一条容量为时间的边（一开始连了N * M的容量，坑了好久。。），再将所有空点向时间内能到达的门连一条容量为1的边。</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#75715e">//HNOI2007 evacuate.cpp
</span><span style="color:#75715e"></span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;algorithm&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;iostream&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstring&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdlib&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdio&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;string&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;vector&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cmath&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;queue&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;stack&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;set&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;map&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span>
<span style="color:#75715e">//#define LOCAL
</span><span style="color:#75715e">//#define VISUAL_STUDIO
</span><span style="color:#75715e"></span><span style="color:#75715e">#define READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define READ_FILE
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXN <span style="color:#f92672">=</span> <span style="color:#ae81ff">25</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXPT <span style="color:#f92672">=</span> <span style="color:#ae81ff">410</span>;

<span style="color:#75715e">#ifdef LOCAL
</span><span style="color:#75715e">#define LOCAL_TIME
</span><span style="color:#75715e">#define LOCAL_DEBUG
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define STD_DEBUG
</span><span style="color:#75715e"></span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef VISUAL_STUDIO
</span><span style="color:#75715e">#pragma warning(disable: 4996)
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;ctime&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#66d9ef">char</span> fread_char;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">fread_init</span>()
{
	fread_char <span style="color:#f92672">=</span> getchar();
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">get_int</span>()
{
	<span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
	<span style="color:#66d9ef">while</span> ((fread_char <span style="color:#f92672">&lt;</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">||</span> (fread_char <span style="color:#f92672">&gt;</span> <span style="color:#e6db74">&#39;9&#39;</span>))
	{
		fread_char <span style="color:#f92672">=</span> getchar();
	}
	<span style="color:#66d9ef">while</span> ((fread_char <span style="color:#f92672">&gt;=</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (fread_char <span style="color:#f92672">&lt;=</span> <span style="color:#e6db74">&#39;9&#39;</span>))
	{
		ret <span style="color:#f92672">=</span> ret <span style="color:#f92672">*</span> <span style="color:#ae81ff">10</span> <span style="color:#f92672">+</span> fread_char <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;0&#39;</span>;
		fread_char <span style="color:#f92672">=</span> getchar();
	}
	<span style="color:#66d9ef">return</span> ret;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">char</span> <span style="color:#a6e22e">get_char</span>()
{
	<span style="color:#66d9ef">char</span> ret;
	<span style="color:#66d9ef">while</span> ((fread_char <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39; &#39;</span>) <span style="color:#f92672">||</span> (fread_char <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;n&#39;</span>))
	{
		fread_char <span style="color:#f92672">=</span> getchar();
	}
	ret <span style="color:#f92672">=</span> fread_char;
	fread_char <span style="color:#f92672">=</span> getchar();
	<span style="color:#66d9ef">return</span> ret;
}
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">read</span>(<span style="color:#66d9ef">int</span> <span style="color:#f92672">&amp;</span>a)
{
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>	a <span style="color:#f92672">=</span> get_int();
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>	scanf(<span style="color:#e6db74">&#34;%d&#34;</span>, <span style="color:#f92672">&amp;</span>a);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">read</span>(<span style="color:#66d9ef">char</span> <span style="color:#f92672">&amp;</span>a)
{
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>	a <span style="color:#f92672">=</span> get_char();
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>	scanf(<span style="color:#e6db74">&#34;%c&#34;</span>, <span style="color:#f92672">&amp;</span>a);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#66d9ef">int</span> n, m;
<span style="color:#66d9ef">char</span> map[MAXN][MAXN];
<span style="color:#66d9ef">int</span> d[MAXPT][MAXPT];
<span style="color:#66d9ef">bool</span> graph_in[MAXPT], graph_out[MAXPT];
<span style="color:#66d9ef">int</span> l, r, mid, tot_p;
<span style="color:#66d9ef">int</span> s, t;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">get_node</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> i, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> j)
{
	<span style="color:#66d9ef">return</span> (i <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>) <span style="color:#f92672">*</span> m <span style="color:#f92672">+</span> j;
}

<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">queue_node</span>
{
	<span style="color:#66d9ef">int</span> id, height;
	<span style="color:#66d9ef">inline</span> <span style="color:#a6e22e">queue_node</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> id_ <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> height_ <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>)
	{
		id <span style="color:#f92672">=</span> id_;
		height <span style="color:#f92672">=</span> height_;
	}
	<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">bool</span> <span style="color:#66d9ef">operator</span> <span style="color:#f92672">&lt;</span> (<span style="color:#66d9ef">const</span> queue_node <span style="color:#f92672">&amp;</span>b) <span style="color:#66d9ef">const</span>
	{
		<span style="color:#66d9ef">return</span> height <span style="color:#f92672">&lt;</span> b.height;
	}
};

<span style="color:#66d9ef">int</span> flow_graph[MAXPT][MAXPT];
<span style="color:#66d9ef">int</span> height[MAXPT], inflow[MAXPT], gap[MAXPT];
<span style="color:#66d9ef">bool</span> visit[MAXPT], in_q[MAXPT];
std<span style="color:#f92672">::</span>queue <span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> bfs_q;
std<span style="color:#f92672">::</span>priority_queue <span style="color:#f92672">&lt;</span>queue_node<span style="color:#f92672">&gt;</span> Q;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">bfs</span>()
{
	gap[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
	bfs_q.push(t);
	visit[t] <span style="color:#f92672">=</span> true;
	<span style="color:#66d9ef">int</span> tmp;
	<span style="color:#66d9ef">while</span> (<span style="color:#f92672">!</span>bfs_q.empty())
	{
		tmp <span style="color:#f92672">=</span> bfs_q.front();
		bfs_q.pop();
		<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> s; i <span style="color:#f92672">&lt;=</span> t; i<span style="color:#f92672">++</span>)
		{
			<span style="color:#66d9ef">if</span> ((<span style="color:#f92672">!</span>visit[i]) <span style="color:#f92672">&amp;&amp;</span> (flow_graph[i][tmp] <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>))
			{
				gap[height[i] <span style="color:#f92672">=</span> height[tmp] <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>]<span style="color:#f92672">++</span>;
				visit[i] <span style="color:#f92672">=</span> true;
				bfs_q.push(i);
			}
		}
	}
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">max_flow_init</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> time)
{
	memset(flow_graph, <span style="color:#ae81ff">0</span>, <span style="color:#66d9ef">sizeof</span>(flow_graph));
	memset(height, <span style="color:#ae81ff">0</span>, <span style="color:#66d9ef">sizeof</span>(height));
	memset(inflow, <span style="color:#ae81ff">0</span>, <span style="color:#66d9ef">sizeof</span>(inflow));
	memset(gap, <span style="color:#ae81ff">0</span>, <span style="color:#66d9ef">sizeof</span>(gap));
	memset(visit, false, <span style="color:#66d9ef">sizeof</span>(visit));
	memset(in_q, false, <span style="color:#66d9ef">sizeof</span>(in_q));
	in_q[s] <span style="color:#f92672">=</span> in_q[t] <span style="color:#f92672">=</span> true;
	<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> s <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;</span> t; i<span style="color:#f92672">++</span>)
	{
		flow_graph[s][i] <span style="color:#f92672">=</span> graph_in[i];
		flow_graph[i][t] <span style="color:#f92672">=</span> graph_out[i] <span style="color:#f92672">*</span> time;
	}
	<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> s <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;</span> t; i<span style="color:#f92672">++</span>)
	{
		<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> j <span style="color:#f92672">=</span> s <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>; j <span style="color:#f92672">&lt;</span> t; j<span style="color:#f92672">++</span>)
		{
			<span style="color:#66d9ef">if</span> (graph_out[j])
			{
				flow_graph[i][j] <span style="color:#f92672">=</span> (d[i][j] <span style="color:#f92672">&lt;=</span> time) <span style="color:#f92672">&amp;&amp;</span> (d[i][j] <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>) <span style="color:#f92672">?</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">:</span> <span style="color:#ae81ff">0</span>;
			}
		}
	}
	bfs();
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">max_flow</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> time)
{
	max_flow_init(time);
	<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> s <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;</span> t; i<span style="color:#f92672">++</span>)
	{
		<span style="color:#66d9ef">if</span> (flow_graph[s][i] <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>)
		{
			flow_graph[i][s] <span style="color:#f92672">=</span> inflow[i] <span style="color:#f92672">=</span> flow_graph[s][i];
			flow_graph[s][i] <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
			in_q[i] <span style="color:#f92672">=</span> true;
			Q.push(queue_node(i, height[i]));
		}
	}
	queue_node tmp;
	<span style="color:#66d9ef">int</span> push_flow, min_height;
	<span style="color:#66d9ef">while</span> (<span style="color:#f92672">!</span>Q.empty())
	{
		tmp <span style="color:#f92672">=</span> Q.top();
		Q.pop();
		in_q[tmp.id] <span style="color:#f92672">=</span> false;
		<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> s <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>; (i <span style="color:#f92672">&lt;=</span> t) <span style="color:#f92672">&amp;&amp;</span> (inflow[tmp.id] <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>); i<span style="color:#f92672">++</span>)
		{
			<span style="color:#66d9ef">if</span> ((flow_graph[tmp.id][i] <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>) <span style="color:#f92672">&amp;&amp;</span> (height[tmp.id] <span style="color:#f92672">==</span> height[i] <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>))
			{
				push_flow <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>min(inflow[tmp.id], flow_graph[tmp.id][i]);
				inflow[i] <span style="color:#f92672">+=</span> push_flow;
				inflow[tmp.id] <span style="color:#f92672">-=</span> push_flow;
				flow_graph[tmp.id][i] <span style="color:#f92672">-=</span> push_flow;
				flow_graph[i][tmp.id] <span style="color:#f92672">+=</span> push_flow;
				<span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span>in_q[i])
				{
					in_q[i] <span style="color:#f92672">=</span> true;
					Q.push(queue_node(i, height[i]));
				}
			}
		}
		<span style="color:#66d9ef">if</span> ((inflow[tmp.id] <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>) <span style="color:#f92672">&amp;&amp;</span> (tmp.id <span style="color:#f92672">&lt;</span> t))
		{
			min_height <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
			<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> s <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;</span> t; i<span style="color:#f92672">++</span>)
			{
				<span style="color:#66d9ef">if</span> (flow_graph[tmp.id][i] <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>)
				{
					<span style="color:#66d9ef">if</span> ((min_height <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>) <span style="color:#f92672">||</span> (min_height <span style="color:#f92672">&gt;</span> height[i]))
					{
						min_height <span style="color:#f92672">=</span> height[i];
					}
				}
			}
			<span style="color:#66d9ef">if</span> ((min_height <span style="color:#f92672">&gt;</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>) <span style="color:#f92672">&amp;&amp;</span> (min_height <span style="color:#f92672">&lt;</span> t))
			{
				gap[height[tmp.id]]<span style="color:#f92672">--</span>;
				<span style="color:#66d9ef">if</span> (gap[height[tmp.id]] <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>)
				{
					<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> s <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;</span> t; i<span style="color:#f92672">++</span>)
					{
						<span style="color:#66d9ef">if</span> ((height[i] <span style="color:#f92672">&gt;=</span> height[tmp.id]) <span style="color:#f92672">&amp;&amp;</span> (height[i] <span style="color:#f92672">&lt;</span> t))
						{
							gap[height[i]]<span style="color:#f92672">--</span>;
							height[i] <span style="color:#f92672">=</span> t;
							<span style="color:#66d9ef">if</span> (in_q[i])
							{
								Q.pop();
							}
						}
					}
				}
				<span style="color:#66d9ef">else</span>
				{
					gap[height[tmp.id] <span style="color:#f92672">=</span> min_height <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>]<span style="color:#f92672">++</span>;
					Q.push(queue_node(tmp.id, height[tmp.id]));
				}
				in_q[tmp.id] <span style="color:#f92672">=</span> true;
			}
		}
	}
	<span style="color:#66d9ef">return</span> inflow[t];
}

<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">map_node</span>
{
	<span style="color:#66d9ef">int</span> x, y;
	<span style="color:#66d9ef">inline</span> <span style="color:#a6e22e">map_node</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> x_ <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> y_ <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>)
	{
		x <span style="color:#f92672">=</span> x_;
		y <span style="color:#f92672">=</span> y_;
	}
};

std<span style="color:#f92672">::</span>queue <span style="color:#f92672">&lt;</span>map_node<span style="color:#f92672">&gt;</span> map_q;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">do_bfs</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> x, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> y)
{
	map_node tmp;
	<span style="color:#66d9ef">while</span> (<span style="color:#f92672">!</span>map_q.empty())
	{
		tmp <span style="color:#f92672">=</span> map_q.front();
		map_q.pop();
		<span style="color:#66d9ef">if</span> ((map[tmp.x <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>][tmp.y] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;.&#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (d[get_node(tmp.x <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>, tmp.y)][get_node(x, y)] <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>))
		{
			d[get_node(tmp.x <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>, tmp.y)][get_node(x, y)] <span style="color:#f92672">=</span> d[get_node(tmp.x, tmp.y)][get_node(x, y)] <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
			map_q.push(map_node(tmp.x <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>, tmp.y));
		}
		<span style="color:#66d9ef">if</span> ((map[tmp.x <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>][tmp.y] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;.&#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (d[get_node(tmp.x <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, tmp.y)][get_node(x, y)] <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>))
		{
			d[get_node(tmp.x <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, tmp.y)][get_node(x, y)] <span style="color:#f92672">=</span> d[get_node(tmp.x, tmp.y)][get_node(x, y)] <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
			map_q.push(map_node(tmp.x <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, tmp.y));
		}
		<span style="color:#66d9ef">if</span> ((map[tmp.x][tmp.y <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;.&#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (d[get_node(tmp.x, tmp.y <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>)][get_node(x, y)] <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>))
		{
			d[get_node(tmp.x, tmp.y <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>)][get_node(x, y)] <span style="color:#f92672">=</span> d[get_node(tmp.x, tmp.y)][get_node(x, y)] <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
			map_q.push(map_node(tmp.x, tmp.y <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>));
		}
		<span style="color:#66d9ef">if</span> ((map[tmp.x][tmp.y <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;.&#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (d[get_node(tmp.x, tmp.y <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>)][get_node(x, y)] <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>))
		{
			d[get_node(tmp.x, tmp.y <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>)][get_node(x, y)] <span style="color:#f92672">=</span> d[get_node(tmp.x, tmp.y)][get_node(x, y)] <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
			map_q.push(map_node(tmp.x, tmp.y <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>));
		}
	}
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">prepare_bfs</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> x, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> y)
{
	<span style="color:#66d9ef">if</span> (map[x][y] <span style="color:#f92672">!=</span> <span style="color:#e6db74">&#39;D&#39;</span>)
	{
		<span style="color:#66d9ef">return</span>;
	}
	<span style="color:#66d9ef">if</span> (x <span style="color:#f92672">==</span> <span style="color:#ae81ff">1</span>)
	{
		<span style="color:#66d9ef">if</span> (map[x <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>][y] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;.&#39;</span>)
		{
			map_q.push(map_node(x <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, y));
			d[get_node(x <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, y)][get_node(x, y)] <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
			do_bfs(x, y);
		}
	}
	<span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (x <span style="color:#f92672">==</span> n)
	{
		<span style="color:#66d9ef">if</span> (map[x <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>][y] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;.&#39;</span>)
		{
			map_q.push(map_node(x <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>, y));
			d[get_node(x <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>, y)][get_node(x, y)] <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
			do_bfs(x, y);
		}
	}
	<span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (y <span style="color:#f92672">==</span> <span style="color:#ae81ff">1</span>)
	{
		<span style="color:#66d9ef">if</span> (map[x][y <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;.&#39;</span>)
		{
			map_q.push(map_node(x, y <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>));
			d[get_node(x, y <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>)][get_node(x, y)] <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
			do_bfs(x, y);
		}
	}
	<span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (y <span style="color:#f92672">==</span> m)
	{
		<span style="color:#66d9ef">if</span> (map[x][y <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;.&#39;</span>)
		{
			map_q.push(map_node(x, y <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>));
			d[get_node(x, y <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>)][get_node(x, y)] <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
			do_bfs(x, y);
		}
	}
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>	<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">2</span>; i <span style="color:#f92672">&lt;</span> n; i<span style="color:#f92672">++</span>)
	{
		<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> j <span style="color:#f92672">=</span> <span style="color:#ae81ff">2</span>; j <span style="color:#f92672">&lt;</span> m; j<span style="color:#f92672">++</span>)
		{
			printf(<span style="color:#e6db74">&#34;%d &#34;</span>, d[get_node(i, j)][<span style="color:#ae81ff">11</span>]);
		}
		printf(<span style="color:#e6db74">&#34;n&#34;</span>);
	}
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">bfs_init</span>()
{
	<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">2</span>; i <span style="color:#f92672">&lt;</span> n; i<span style="color:#f92672">++</span>)
	{
		prepare_bfs(i, <span style="color:#ae81ff">1</span>);
		prepare_bfs(i, m);
	}
	<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">2</span>; i <span style="color:#f92672">&lt;</span> m; i<span style="color:#f92672">++</span>)
	{
		prepare_bfs(<span style="color:#ae81ff">1</span>, i);
		prepare_bfs(n, i);
	}
}

<span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>	<span style="color:#66d9ef">long</span> <span style="color:#66d9ef">long</span> start_time_ <span style="color:#f92672">=</span> clock();
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>	freopen(<span style="color:#e6db74">&#34;evacuate.in&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>, stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>	freopen(<span style="color:#e6db74">&#34;evacuate.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>	fread_init();
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>	read(n);
	read(m);
	s <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
	t <span style="color:#f92672">=</span> n <span style="color:#f92672">*</span> m <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
	<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;=</span> n; i<span style="color:#f92672">++</span>)
	{
		<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> j <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; j <span style="color:#f92672">&lt;=</span> m; j<span style="color:#f92672">++</span>)
		{
			read(map[i][j]);
			<span style="color:#66d9ef">if</span> (map[i][j] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;.&#39;</span>)
			{
				tot_p<span style="color:#f92672">++</span>;
				graph_in[get_node(i, j)] <span style="color:#f92672">=</span> true;
			}
			<span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (map[i][j] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;D&#39;</span>)
			{
				graph_out[get_node(i, j)] <span style="color:#f92672">=</span> true;
			}
		}
	}
	bfs_init();
	l <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>, r <span style="color:#f92672">=</span> n <span style="color:#f92672">*</span> m;
	<span style="color:#66d9ef">while</span> (l <span style="color:#f92672">&lt;</span> r)
	{
		mid <span style="color:#f92672">=</span> (l <span style="color:#f92672">+</span> r) <span style="color:#f92672">&gt;&gt;</span> <span style="color:#ae81ff">1</span>;
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>		<span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> max_flow(mid);
		printf(<span style="color:#e6db74">&#34;MAX_FLOW: %d %d %dn&#34;</span>, mid, ret, tot_p);
		<span style="color:#66d9ef">if</span> (ret <span style="color:#f92672">&gt;=</span> tot_p)
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>		<span style="color:#66d9ef">if</span> (max_flow(mid) <span style="color:#f92672">&gt;=</span> tot_p)
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>		{
			r <span style="color:#f92672">=</span> mid;
		}
		<span style="color:#66d9ef">else</span>
		{
			l <span style="color:#f92672">=</span> mid <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
		}
	}
	<span style="color:#66d9ef">if</span> (l <span style="color:#f92672">&gt;=</span> n <span style="color:#f92672">*</span> m)
	{
		printf(<span style="color:#e6db74">&#34;impossible&#34;</span>);
	}
	<span style="color:#66d9ef">else</span>
	{
		printf(<span style="color:#e6db74">&#34;%d&#34;</span>, l);
	}
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>	printf(<span style="color:#e6db74">&#34;nrun time: %lld msn&#34;</span>, (clock() <span style="color:#f92672">-</span> start_time_) <span style="color:#f92672">/</span> <span style="color:#ae81ff">1000</span>);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>	fclose(stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>	fclose(stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>	<span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
}

</code></pre></div>]]></content></item><item><title>[BZOJ1433][ZJOI2009]假期的宿舍（最大流）</title><link>https://www.sxn.dev/posts/zjoi2009-holiday/</link><pubDate>Tue, 20 May 2014 20:58:14 +0000</pubDate><guid>https://www.sxn.dev/posts/zjoi2009-holiday/</guid><description>&lt;p>又是一道最大流，建图很简单，源点到所有的在校学生和外校学生建一条容量为1的边，所有在校学生的床（感觉听起来怪怪的）到汇点连一条边，所有在校学生和自己的床连一条边，所有学生到他认识的在校学生的床连一条边。然后做最大流与需要住校的学生总数比较，相等就输出^_^，不相等就输出T_T（这个太逗了）。。&lt;/p></description><content type="html"><![CDATA[<p>又是一道最大流，建图很简单，源点到所有的在校学生和外校学生建一条容量为1的边，所有在校学生的床（感觉听起来怪怪的）到汇点连一条边，所有在校学生和自己的床连一条边，所有学生到他认识的在校学生的床连一条边。然后做最大流与需要住校的学生总数比较，相等就输出^_^，不相等就输出T_T（这个太逗了）。。</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#75715e">//ZJOI2009 holiday.cpp
</span><span style="color:#75715e"></span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;algorithm&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;iostream&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstring&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdlib&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdio&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;vector&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cmath&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;queue&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;stack&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;map&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;set&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span>
<span style="color:#75715e">//#define LOCAL
</span><span style="color:#75715e">//#define READ_FILE
</span><span style="color:#75715e"></span><span style="color:#75715e">#define READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define VISUAL_STUDIO
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXN <span style="color:#f92672">=</span> <span style="color:#ae81ff">50</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXPT <span style="color:#f92672">=</span> <span style="color:#ae81ff">110</span>;

<span style="color:#75715e">#ifdef LOCAL
</span><span style="color:#75715e">#define LOCAL_TIME
</span><span style="color:#75715e">#define LOCAL_DEBUG
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define STD_DEBUG
</span><span style="color:#75715e"></span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef VISUAL_STUDIO
</span><span style="color:#75715e">#pragma warning(disable: 4996)
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;ctime&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#66d9ef">char</span> fread_char;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">fread_init</span>()
{
	fread_char <span style="color:#f92672">=</span> getchar();
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">get_int</span>()
{
	<span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
	<span style="color:#66d9ef">while</span> ((fread_char <span style="color:#f92672">&lt;</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">||</span> (fread_char <span style="color:#f92672">&gt;</span> <span style="color:#e6db74">&#39;9&#39;</span>))
	{
		fread_char <span style="color:#f92672">=</span> getchar();
	}
	<span style="color:#66d9ef">while</span> ((fread_char <span style="color:#f92672">&gt;=</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (fread_char <span style="color:#f92672">&lt;=</span> <span style="color:#e6db74">&#39;9&#39;</span>))
	{
		ret <span style="color:#f92672">=</span> ret <span style="color:#f92672">*</span> <span style="color:#ae81ff">10</span> <span style="color:#f92672">+</span> fread_char <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;0&#39;</span>;
		fread_char <span style="color:#f92672">=</span> getchar();
	}
	<span style="color:#66d9ef">return</span> ret;
}
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">read</span>(<span style="color:#66d9ef">int</span> <span style="color:#f92672">&amp;</span>a)
{
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>	a <span style="color:#f92672">=</span> get_int();
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>	scanf(<span style="color:#e6db74">&#34;%d&#34;</span>, <span style="color:#f92672">&amp;</span>a);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">queue_node</span>
{
	<span style="color:#66d9ef">int</span> id, height;
	<span style="color:#66d9ef">inline</span> <span style="color:#a6e22e">queue_node</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> id_ <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> height_ <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>)
	{
		id <span style="color:#f92672">=</span> id_;
		height <span style="color:#f92672">=</span> height_;
	}
	<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">bool</span> <span style="color:#66d9ef">operator</span> <span style="color:#f92672">&lt;</span> (<span style="color:#66d9ef">const</span> queue_node <span style="color:#f92672">&amp;</span>b) <span style="color:#66d9ef">const</span>
	{
		<span style="color:#66d9ef">return</span> height <span style="color:#f92672">&lt;</span> b.height;
	}
};

<span style="color:#66d9ef">int</span> cases, n;
<span style="color:#66d9ef">int</span> s, t;
<span style="color:#66d9ef">int</span> tot_at_school;
<span style="color:#66d9ef">int</span> school_student[MAXN];
<span style="color:#66d9ef">int</span> at_home[MAXN];
<span style="color:#66d9ef">int</span> k;
<span style="color:#66d9ef">int</span> graph[MAXPT][MAXPT];
<span style="color:#66d9ef">int</span> height[MAXPT], inflow[MAXPT], gap[MAXPT];
<span style="color:#66d9ef">bool</span> visit[MAXPT], in_q[MAXPT];
std<span style="color:#f92672">::</span>queue <span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> bfs_q;
std<span style="color:#f92672">::</span>priority_queue <span style="color:#f92672">&lt;</span>queue_node<span style="color:#f92672">&gt;</span> Q;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">add_edge</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> u, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> v)
{
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>	printf(<span style="color:#e6db74">&#34;ADDEDGE %d %dn&#34;</span>, u, v);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>	graph[u][v] <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">bfs</span>()
{
	memset(visit, false, <span style="color:#66d9ef">sizeof</span>(visit));
	memset(height, <span style="color:#ae81ff">0</span>, <span style="color:#66d9ef">sizeof</span>(height));
	memset(gap, <span style="color:#ae81ff">0</span>, <span style="color:#66d9ef">sizeof</span>(gap));
	gap[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
	bfs_q.push(t);
	<span style="color:#66d9ef">int</span> tmp;
	<span style="color:#66d9ef">while</span> (<span style="color:#f92672">!</span>bfs_q.empty())
	{
		tmp <span style="color:#f92672">=</span> bfs_q.front();
		bfs_q.pop();
		<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> s; i <span style="color:#f92672">&lt;</span> t; i<span style="color:#f92672">++</span>)
		{
			<span style="color:#66d9ef">if</span> ((graph[i][tmp] <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>) <span style="color:#f92672">&amp;&amp;</span> (<span style="color:#f92672">!</span>visit[i]))
			{
				gap[height[i] <span style="color:#f92672">=</span> height[tmp] <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>]<span style="color:#f92672">++</span>;
				visit[i] <span style="color:#f92672">=</span> true;
				bfs_q.push(i);
			}
		}
	}
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">max_flow</span>()
{
	memset(in_q, false, <span style="color:#66d9ef">sizeof</span>(in_q));
	memset(inflow, <span style="color:#ae81ff">0</span>, <span style="color:#66d9ef">sizeof</span>(inflow));
	in_q[s] <span style="color:#f92672">=</span> in_q[t] <span style="color:#f92672">=</span> true;
	<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;=</span> n; i<span style="color:#f92672">++</span>)
	{
		<span style="color:#66d9ef">if</span> (graph[s][i] <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>)
		{
			graph[i][s] <span style="color:#f92672">=</span> inflow[i] <span style="color:#f92672">=</span> graph[s][i];
			graph[s][i] <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
			in_q[i] <span style="color:#f92672">=</span> true;
			Q.push(queue_node(i, height[i]));
		}
	}
	queue_node tmp;
	<span style="color:#66d9ef">int</span> push_flow <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
	<span style="color:#66d9ef">int</span> min_height <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
	<span style="color:#66d9ef">while</span> (<span style="color:#f92672">!</span>Q.empty())
	{
		tmp <span style="color:#f92672">=</span> Q.top();
		Q.pop();
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>		printf(<span style="color:#e6db74">&#34;POP ID HEIGHT INFLOW: %d %d %dn&#34;</span>, tmp.id, tmp.height, inflow[tmp.id]);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>		in_q[tmp.id] <span style="color:#f92672">=</span> false;
		<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> s <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>; (i <span style="color:#f92672">&lt;=</span> t) <span style="color:#f92672">&amp;&amp;</span> (inflow[tmp.id] <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>); i<span style="color:#f92672">++</span>)
		{
			<span style="color:#66d9ef">if</span> ((graph[tmp.id][i] <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>) <span style="color:#f92672">&amp;&amp;</span> (height[tmp.id] <span style="color:#f92672">==</span> height[i] <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>))
			{
				push_flow <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>min(graph[tmp.id][i], inflow[tmp.id]);
				graph[tmp.id][i] <span style="color:#f92672">-=</span> push_flow;
				graph[i][tmp.id] <span style="color:#f92672">+=</span> push_flow;
				inflow[tmp.id] <span style="color:#f92672">-=</span> push_flow;
				inflow[i] <span style="color:#f92672">+=</span> push_flow;
				<span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span>in_q[i])
				{
					in_q[i] <span style="color:#f92672">=</span> true;
					Q.push(queue_node(i, height[i]));
				}
			}
		}
		<span style="color:#66d9ef">if</span> ((inflow[tmp.id] <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>) <span style="color:#f92672">&amp;&amp;</span> (tmp.id <span style="color:#f92672">&lt;</span> t))
		{
			min_height <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
			<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> s <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;=</span> t; i<span style="color:#f92672">++</span>)
			{
				<span style="color:#66d9ef">if</span> (graph[tmp.id][i] <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>)
				{
					<span style="color:#66d9ef">if</span> ((min_height <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>) <span style="color:#f92672">||</span> (min_height <span style="color:#f92672">&gt;</span> height[i]))
					{
						min_height <span style="color:#f92672">=</span> height[i];
					}
				}
			}
			<span style="color:#66d9ef">if</span> ((min_height <span style="color:#f92672">&gt;</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>) <span style="color:#f92672">&amp;</span> (min_height <span style="color:#f92672">&lt;</span> t))
			{
				gap[height[tmp.id]]<span style="color:#f92672">--</span>;
				<span style="color:#66d9ef">if</span> (gap[height[tmp.id]] <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>)
				{
					<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> s <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;</span> t; i<span style="color:#f92672">++</span>)
					{
						<span style="color:#66d9ef">if</span> ((height[i] <span style="color:#f92672">&gt;=</span> height[tmp.id]) <span style="color:#f92672">&amp;&amp;</span> (height[i] <span style="color:#f92672">&lt;</span> t))
						{
							gap[height[i]]<span style="color:#f92672">--</span>;
							height[i] <span style="color:#f92672">=</span> t;
							<span style="color:#66d9ef">if</span> (in_q[i])
							{
								Q.pop();
							}
							<span style="color:#66d9ef">else</span>
							{
								in_q[i] <span style="color:#f92672">=</span> true;
							}
						}
					}
				}
				<span style="color:#66d9ef">else</span>
				{
					gap[height[tmp.id] <span style="color:#f92672">=</span> min_height <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>]<span style="color:#f92672">++</span>;
					in_q[tmp.id] <span style="color:#f92672">=</span> true;
					Q.push(queue_node(tmp.id, height[tmp.id]));
				}
			}
		}
	}
	<span style="color:#66d9ef">return</span> inflow[t];
}

<span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>	<span style="color:#66d9ef">long</span> <span style="color:#66d9ef">long</span> start_time_ <span style="color:#f92672">=</span> clock();
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>	freopen(<span style="color:#e6db74">&#34;holiday.in&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>, stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>	freopen(<span style="color:#e6db74">&#34;holiday.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>	read(cases);
	<span style="color:#66d9ef">while</span> (cases<span style="color:#f92672">--</span>)
	{
		read(n);
		s <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
		t <span style="color:#f92672">=</span> <span style="color:#ae81ff">2</span> <span style="color:#f92672">*</span> n <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
		tot_at_school <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
		memset(graph, <span style="color:#ae81ff">0</span>, <span style="color:#66d9ef">sizeof</span>(graph));
		<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;=</span> n; i<span style="color:#f92672">++</span>)
		{
			read(school_student[i]);
			<span style="color:#66d9ef">if</span> (school_student[i])
			{
				add_edge(n <span style="color:#f92672">+</span> i, t);
			}
			<span style="color:#66d9ef">else</span>
			{
				add_edge(s, i);
				tot_at_school<span style="color:#f92672">++</span>;
			}
		}
		<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;=</span> n; i<span style="color:#f92672">++</span>)
		{
			read(at_home[i]);
			<span style="color:#66d9ef">if</span> (school_student[i] <span style="color:#f92672">&amp;&amp;</span> (<span style="color:#f92672">!</span>at_home[i]))
			{
				add_edge(s, i);
				tot_at_school<span style="color:#f92672">++</span>;
			}
		}
		<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;=</span> n; i<span style="color:#f92672">++</span>)
		{
			<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> j <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; j <span style="color:#f92672">&lt;=</span> n; j<span style="color:#f92672">++</span>)
			{
				read(k);
				<span style="color:#66d9ef">if</span> (i <span style="color:#f92672">==</span> j)
				{
					<span style="color:#66d9ef">if</span> (school_student[i])
					{
						add_edge(i, n <span style="color:#f92672">+</span> i);
					}
				}
				<span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (k)
				{
					<span style="color:#66d9ef">if</span> (school_student[i])
					{
						add_edge(j, n <span style="color:#f92672">+</span> i);
					}
					<span style="color:#66d9ef">if</span> (school_student[j])
					{
						add_edge(i, n <span style="color:#f92672">+</span> j);
					}
				}
			}
		}
		bfs();
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>		<span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> max_flow();
		printf(<span style="color:#e6db74">&#34;%d %dn&#34;</span>, ret, tot_at_school);
		<span style="color:#66d9ef">if</span> (ret <span style="color:#f92672">==</span> tot_at_school)
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>		<span style="color:#66d9ef">if</span> (max_flow() <span style="color:#f92672">==</span> tot_at_school)
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>		{
			printf(<span style="color:#e6db74">&#34;^_^n&#34;</span>);
		}
		<span style="color:#66d9ef">else</span>
		{
			printf(<span style="color:#e6db74">&#34;T_Tn&#34;</span>);
		}
	}
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>	printf(<span style="color:#e6db74">&#34;run time: %lld msn&#34;</span>, clock() <span style="color:#f92672">-</span> start_time_);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>	fclose(stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>	fclose(stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>	<span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
}
</code></pre></div>]]></content></item><item><title>[BZOJ1066][SCOI2007]蜥蜴（最大流）</title><link>https://www.sxn.dev/posts/scoi2007-lizard/</link><pubDate>Tue, 20 May 2014 18:57:37 +0000</pubDate><guid>https://www.sxn.dev/posts/scoi2007-lizard/</guid><description>&lt;p>这道题就是最大流，首先对柱子进行拆点，一个入点和一个出点，入点向出点连一条容量为柱子高度的边，从每个柱子的出点，向可以一次跳到的所有柱子的入点连一条容量为当前柱子高度的边，再从每个可以一次跳出的柱子向汇点连一条容量为柱子高度的边，从源点向每个有蜥蜴的柱子的入点连一条容量为1的边，然后做一次最大流即可。当然答案输出的是不能跳出的蜥蜴，我被坑了好久233&lt;/p></description><content type="html"><![CDATA[<p>这道题就是最大流，首先对柱子进行拆点，一个入点和一个出点，入点向出点连一条容量为柱子高度的边，从每个柱子的出点，向可以一次跳到的所有柱子的入点连一条容量为当前柱子高度的边，再从每个可以一次跳出的柱子向汇点连一条容量为柱子高度的边，从源点向每个有蜥蜴的柱子的入点连一条容量为1的边，然后做一次最大流即可。当然答案输出的是不能跳出的蜥蜴，我被坑了好久233</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#75715e">//SCOI2007 lizard.cpp
</span><span style="color:#75715e"></span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;algorithm&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;iostream&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstring&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdlib&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdio&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;string&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;vector&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;queue&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;stack&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cmath&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;set&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;map&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span>
<span style="color:#75715e">//#define LOCAL
</span><span style="color:#75715e"></span><span style="color:#75715e">#define READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define READ_FILE
</span><span style="color:#75715e">//#define VISUAL_STUDIO
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXN <span style="color:#f92672">=</span> <span style="color:#ae81ff">20</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXPT <span style="color:#f92672">=</span> <span style="color:#ae81ff">2</span> <span style="color:#f92672">*</span> MAXN <span style="color:#f92672">*</span> MAXN <span style="color:#f92672">+</span> <span style="color:#ae81ff">2</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXM <span style="color:#f92672">=</span> <span style="color:#ae81ff">170000</span>;

<span style="color:#75715e">#ifdef LOCAL
</span><span style="color:#75715e">#define LOCAL_DEBUG
</span><span style="color:#75715e">#define LOCAL_TIME
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define STD_DEBUG
</span><span style="color:#75715e"></span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef VISUAL_STUDIO
</span><span style="color:#75715e">#pragma warning(disable: 4996)
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;ctime&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#66d9ef">char</span> fread_char;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">fread_init</span>()
{
    fread_char <span style="color:#f92672">=</span> getchar();
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">get_int</span>()
{
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">while</span> ((fread_char <span style="color:#f92672">&lt;</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">||</span> (fread_char <span style="color:#f92672">&gt;</span> <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        fread_char <span style="color:#f92672">=</span> getchar();
    }
    <span style="color:#66d9ef">while</span> ((fread_char <span style="color:#f92672">&gt;=</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (fread_char <span style="color:#f92672">&lt;=</span> <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        ret <span style="color:#f92672">=</span> ret <span style="color:#f92672">*</span> <span style="color:#ae81ff">10</span> <span style="color:#f92672">+</span> fread_char <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;0&#39;</span>;
        fread_char <span style="color:#f92672">=</span> getchar();
    }
    <span style="color:#66d9ef">return</span> ret;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">char</span> <span style="color:#a6e22e">get_char</span>()
{
    <span style="color:#66d9ef">char</span> ret;
    <span style="color:#66d9ef">while</span> ((fread_char <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39; &#39;</span>) <span style="color:#f92672">||</span> (fread_char <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;n&#39;</span>))
    {
        fread_char <span style="color:#f92672">=</span> getchar();
    }
    ret <span style="color:#f92672">=</span> fread_char;
    fread_char <span style="color:#f92672">=</span> getchar();
    <span style="color:#66d9ef">return</span> ret;
}
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">read</span>(<span style="color:#66d9ef">int</span> <span style="color:#f92672">&amp;</span>a)
{
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>    a <span style="color:#f92672">=</span> get_int();
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>    scanf(<span style="color:#e6db74">&#34;%d&#34;</span>, <span style="color:#f92672">&amp;</span>a);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">read</span>(<span style="color:#66d9ef">char</span> <span style="color:#f92672">&amp;</span>a)
{
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>    a <span style="color:#f92672">=</span> get_char();
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>    scanf(<span style="color:#e6db74">&#34;%c&#34;</span>, <span style="color:#f92672">&amp;</span>a);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">pillar_node</span>
{
    <span style="color:#66d9ef">int</span> x, y, d;
};

<span style="color:#66d9ef">int</span> graph[MAXPT][MAXPT];

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">add_edge</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> u, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> v, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> d)
{
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>    printf(<span style="color:#e6db74">&#34;ADD_EDGE %d %d %dn&#34;</span>, u, v, d);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    graph[u][v] <span style="color:#f92672">=</span> d;
    graph[v][u] <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
}

<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">queue_node</span>
{
    <span style="color:#66d9ef">int</span> id, height;
    <span style="color:#66d9ef">inline</span> <span style="color:#a6e22e">queue_node</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> id_ <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> height_ <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>)
    {
        id <span style="color:#f92672">=</span> id_;
        height <span style="color:#f92672">=</span> height_;
    }
    <span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">bool</span> <span style="color:#66d9ef">operator</span> <span style="color:#f92672">&lt;</span> (<span style="color:#66d9ef">const</span> queue_node <span style="color:#f92672">&amp;</span>b) <span style="color:#66d9ef">const</span>
    {
        <span style="color:#66d9ef">return</span> height <span style="color:#f92672">&lt;</span> b.height;
    }
};

<span style="color:#66d9ef">int</span> r, c, d;
<span style="color:#66d9ef">int</span> tot_lizard;
pillar_node pillar[MAXM];
<span style="color:#66d9ef">int</span> tot_pillar;
<span style="color:#66d9ef">int</span> k;
<span style="color:#66d9ef">char</span> tmp_k;
<span style="color:#66d9ef">char</span> lizard_pt;
<span style="color:#66d9ef">int</span> s, t;
<span style="color:#66d9ef">int</span> gap[MAXPT];
<span style="color:#66d9ef">int</span> height[MAXPT], inflow[MAXPT];
<span style="color:#66d9ef">bool</span> in_q[MAXPT];
<span style="color:#66d9ef">bool</span> visit[MAXPT];
std<span style="color:#f92672">::</span>priority_queue <span style="color:#f92672">&lt;</span>queue_node<span style="color:#f92672">&gt;</span> Q;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">in_pt</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> x, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> y)
{
    <span style="color:#66d9ef">return</span> (x <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>) <span style="color:#f92672">*</span> c <span style="color:#f92672">+</span> y;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">out_pt</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> x, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> y)
{
    <span style="color:#66d9ef">return</span> r <span style="color:#f92672">*</span> c <span style="color:#f92672">+</span> (x <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>) <span style="color:#f92672">*</span> c <span style="color:#f92672">+</span> y;
}

std<span style="color:#f92672">::</span>queue <span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> bfs_q;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">bfs</span>()
{
    gap[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
    bfs_q.push(t);
    visit[t] <span style="color:#f92672">=</span> true;
    <span style="color:#66d9ef">int</span> tmp;
    <span style="color:#66d9ef">while</span> (<span style="color:#f92672">!</span>bfs_q.empty())
    {
        tmp <span style="color:#f92672">=</span> bfs_q.front();
        bfs_q.pop();
        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> s; i <span style="color:#f92672">&lt;</span> t; i<span style="color:#f92672">++</span>)
        {
            <span style="color:#66d9ef">if</span> ((<span style="color:#f92672">!</span>visit[i]) <span style="color:#f92672">&amp;&amp;</span> (graph[i][tmp] <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>))
            {
                height[i] <span style="color:#f92672">=</span> height[tmp] <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
                gap[height[i]]<span style="color:#f92672">++</span>;
                visit[i] <span style="color:#f92672">=</span> true;
                bfs_q.push(i);
            }
        }
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">max_flow</span>()
{
    in_q[s] <span style="color:#f92672">=</span> in_q[t] <span style="color:#f92672">=</span> true;
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> s <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;</span> t; i<span style="color:#f92672">++</span>)
    {
        <span style="color:#66d9ef">if</span> (graph[s][i] <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>)
        {
            inflow[i] <span style="color:#f92672">=</span> graph[s][i];
            graph[i][s] <span style="color:#f92672">=</span> inflow[i];
            graph[s][i] <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
            in_q[i] <span style="color:#f92672">=</span> true;
            Q.push(queue_node(i, height[i]));
        }
    }
    queue_node tmp;
    <span style="color:#66d9ef">int</span> push_flow <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
    <span style="color:#66d9ef">int</span> min_height <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
    <span style="color:#66d9ef">while</span> (<span style="color:#f92672">!</span>Q.empty())
    {
        tmp <span style="color:#f92672">=</span> Q.top();
        Q.pop();
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>        printf(<span style="color:#e6db74">&#34;DEBUG ID HEIGHT INFLOW: %d %d %dn&#34;</span>, tmp.id, tmp.height, inflow[tmp.id]);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>        in_q[tmp.id] <span style="color:#f92672">=</span> false;
        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> s <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>; (i <span style="color:#f92672">&lt;=</span> t) <span style="color:#f92672">&amp;&amp;</span> (inflow[tmp.id] <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>); i<span style="color:#f92672">++</span>)
        {
            <span style="color:#66d9ef">if</span> ((graph[tmp.id][i] <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>) <span style="color:#f92672">&amp;&amp;</span> (height[tmp.id] <span style="color:#f92672">==</span> height[i] <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>))
            {
                push_flow <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>min(inflow[tmp.id], graph[tmp.id][i]);
                inflow[tmp.id] <span style="color:#f92672">-=</span> push_flow;
                inflow[i] <span style="color:#f92672">+=</span> push_flow;
                graph[tmp.id][i] <span style="color:#f92672">-=</span> push_flow;
                graph[i][tmp.id] <span style="color:#f92672">+=</span> push_flow;
                <span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span>in_q[i])
                {
                    in_q[i] <span style="color:#f92672">=</span> true;
                    Q.push(queue_node(i, height[i]));
                }
            }
        }
        <span style="color:#66d9ef">if</span> (inflow[tmp.id] <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>)
        {
            min_height <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
            <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> s <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;=</span> t; i<span style="color:#f92672">++</span>)
            {
                <span style="color:#66d9ef">if</span> (graph[tmp.id][i] <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>)
                {
                    <span style="color:#66d9ef">if</span> ((min_height <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>) <span style="color:#f92672">||</span> (min_height <span style="color:#f92672">&gt;</span> height[i]))
                    {
                        min_height <span style="color:#f92672">=</span> height[i];
                    }
                }
            }
            <span style="color:#66d9ef">if</span> ((min_height <span style="color:#f92672">&gt;</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>) <span style="color:#f92672">&amp;&amp;</span> (min_height <span style="color:#f92672">&lt;</span> t))
            {
                gap[height[tmp.id]]<span style="color:#f92672">--</span>;
                <span style="color:#66d9ef">if</span> (gap[height[tmp.id]] <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>)
                {
                    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> s <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;</span> t; i<span style="color:#f92672">++</span>)
                    {
                        <span style="color:#66d9ef">if</span> ((height[i] <span style="color:#f92672">&gt;=</span> height[tmp.id]) <span style="color:#f92672">&amp;&amp;</span> (height[i] <span style="color:#f92672">&lt;</span> t))
                        {
                            gap[height[i]]<span style="color:#f92672">--</span>;
                            height[i] <span style="color:#f92672">=</span> t;
                            <span style="color:#66d9ef">if</span> (in_q[i])
                            {
                                Q.pop();
                            }
                        }
                    }
                }
                <span style="color:#66d9ef">else</span>
                {
                    gap[height[tmp.id] <span style="color:#f92672">=</span> min_height <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>]<span style="color:#f92672">++</span>;
                    in_q[tmp.id] <span style="color:#f92672">=</span> true;
                    Q.push(queue_node(tmp.id, height[tmp.id]));
                }
            }
        }
    }
    <span style="color:#66d9ef">return</span> inflow[t];
}

<span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">long</span> <span style="color:#66d9ef">long</span> start_time_ <span style="color:#f92672">=</span> clock();
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;lizard.in&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>, stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;lizard.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>    fread_init();
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    read(r);
    read(c);
    read(d);
    s <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    t <span style="color:#f92672">=</span> r <span style="color:#f92672">*</span> c <span style="color:#f92672">*</span> <span style="color:#ae81ff">2</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;=</span> r; i<span style="color:#f92672">++</span>)
    {
        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> j <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; j <span style="color:#f92672">&lt;=</span> c; j<span style="color:#f92672">++</span>)
        {
            read(tmp_k);
            k <span style="color:#f92672">=</span> tmp_k <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;0&#39;</span>;
            <span style="color:#66d9ef">if</span> (k <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>)
            {
                pillar[tot_pillar].x <span style="color:#f92672">=</span> i;
                pillar[tot_pillar].y <span style="color:#f92672">=</span> j;
                pillar[tot_pillar<span style="color:#f92672">++</span>].d <span style="color:#f92672">=</span> k;
                add_edge(in_pt(i, j), out_pt(i, j), k);
            }
        }
    }
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;=</span> r; i<span style="color:#f92672">++</span>)
    {
        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> j <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; j <span style="color:#f92672">&lt;=</span> c; j<span style="color:#f92672">++</span>)
        {
            read(lizard_pt);
            <span style="color:#66d9ef">if</span> (lizard_pt <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;L&#39;</span>)
            {
                tot_lizard<span style="color:#f92672">++</span>;
                add_edge(s, in_pt(i, j), <span style="color:#ae81ff">1</span>);
            }
        }
    }
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> tot_pillar; i<span style="color:#f92672">++</span>)
    {
        <span style="color:#66d9ef">if</span> ((pillar[i].x <span style="color:#f92672">&lt;=</span> d) <span style="color:#f92672">||</span> (pillar[i].y <span style="color:#f92672">&lt;=</span> d) <span style="color:#f92672">||</span> (r <span style="color:#f92672">-</span> pillar[i].x <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">&lt;=</span> d) <span style="color:#f92672">||</span> (c <span style="color:#f92672">-</span> pillar[i].y <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">&lt;=</span> d))
        {
            add_edge(out_pt(pillar[i].x, pillar[i].y), t, pillar[i].d);
        }
        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> j <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; j <span style="color:#f92672">&lt;</span> tot_pillar; j<span style="color:#f92672">++</span>)
        {
            <span style="color:#66d9ef">if</span> (i <span style="color:#f92672">==</span> j)
            {
                <span style="color:#66d9ef">continue</span>;
            }
            <span style="color:#66d9ef">if</span> ((pillar[i].x <span style="color:#f92672">-</span> pillar[j].x) <span style="color:#f92672">*</span> (pillar[i].x <span style="color:#f92672">-</span> pillar[j].x) <span style="color:#f92672">+</span> (pillar[i].y <span style="color:#f92672">-</span> pillar[j].y) <span style="color:#f92672">*</span> (pillar[i].y <span style="color:#f92672">-</span> pillar[j].y) <span style="color:#f92672">&lt;=</span> d <span style="color:#f92672">*</span> d)
            {
                add_edge(out_pt(pillar[i].x, pillar[i].y), in_pt(pillar[j].x, pillar[j].y), pillar[i].d);
            }
        }
    }
    bfs();
    printf(<span style="color:#e6db74">&#34;%d&#34;</span>, tot_lizard <span style="color:#f92672">-</span> max_flow());
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    printf(<span style="color:#e6db74">&#34;nrun time: %lld msn&#34;</span>, clock() <span style="color:#f92672">-</span> start_time_);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    fclose(stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>    fclose(stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
}
</code></pre></div>]]></content></item><item><title>[BZOJ1934][SHOI2007]Vote 善意的投票（最大流）</title><link>https://www.sxn.dev/posts/shoi-vote/</link><pubDate>Tue, 20 May 2014 15:16:49 +0000</pubDate><guid>https://www.sxn.dev/posts/shoi-vote/</guid><description>双倍经验题，详见 {% post_link jloi2010-champion %}</description><content type="html">&lt;p>双倍经验题，详见 {% post_link jloi2010-champion %}&lt;/p></content></item><item><title>[BZOJ2768][JLOI2010]冠军调查（最大流 最高标号预流推进 + GAP优化）</title><link>https://www.sxn.dev/posts/jloi2010-champion/</link><pubDate>Tue, 20 May 2014 15:10:36 +0000</pubDate><guid>https://www.sxn.dev/posts/jloi2010-champion/</guid><description>&lt;p>这题很显然是一道最小割的题目，然后题目只要求最小割的容量，那么直接跑个最大流（关于最小割-最大流定理请自行谷歌），以前写过DINIC感觉不够高大上，然后果断来一个最高标号预流推进秀优越，事实上这个时间复杂度的确很优秀。一开始我写的没加GAP优化，400+ms，跑得比DINIC还慢，真是不爽，下午看到了一种叫GAP优化的东西，加上之后就28ms了，怒刷到rank2。&lt;/p></description><content type="html"><![CDATA[<p>这题很显然是一道最小割的题目，然后题目只要求最小割的容量，那么直接跑个最大流（关于最小割-最大流定理请自行谷歌），以前写过DINIC感觉不够高大上，然后果断来一个最高标号预流推进秀优越，事实上这个时间复杂度的确很优秀。一开始我写的没加GAP优化，400+ms，跑得比DINIC还慢，真是不爽，下午看到了一种叫GAP优化的东西，加上之后就28ms了，怒刷到rank2。</p>
<blockquote>
<p><!-- raw HTML omitted -->预流推进算法给每一个顶点一个标号h(v)，表示该点到t的最短路（在残量网络中）。&gt;
第一步hights()过程，就是BFS出初始最短路，计算出每一个顶点的h(v)。<!-- raw HTML omitted --></p>
<p><!-- raw HTML omitted -->预流推进算法的特征是运用了预流来加快运算。预流说明图中的节点(除s, t)，仅需要满足流入量 &gt;= 流出量。其中流入量&gt;流出量的接点，我们称之为活动节点。我们的算法就是不断地将活动结点，变为非活动结点，使得预流成为可行流。<!-- raw HTML omitted --></p>
<p><!-- raw HTML omitted -->算法过程prepare()，即首先将与s相连的边设为满流，并将这时产生的活动结点加入队列Q。这是算法的开始。&gt;
以后便重复以下过程直到Q为空：&gt;
(1).选出Q的一个活动顶点u。并依次判断残量网络G&rsquo;中每条边(u, v)，若h(u) = h(v) + 1，则顺着这里条边推流，直到Q变成非活动结点（不存在多余流量）。(Push推流过程)&gt;
(2).如果u还是活动结点。则需要对u进行重新标号：h(u) = min{h(v) + 1}，其中边(u,v)存在于G&rsquo; 中。然后再将u加入队列。(reCalc过程)<!-- raw HTML omitted --></p>
<p><!-- raw HTML omitted -->可以证明，通过以上算法得到的结果就是最大流。&gt;
如果该算法的Q是标准的FIFO队列，则时间复杂度为(n2m)，如果是优先队列，并且标号最高的点优先的话：我们就得到了最高标号预流推进算法，其时间复杂度仅为(n2sqrt(m))，算是比较快的最大流算法了。<!-- raw HTML omitted -->
以上内容摘自雅礼中学ZQM的网络流PPT：<a href="http://shenxn-others.qiniudn.com/%E7%BD%91%E7%BB%9C%E6%B5%81%E7%AE%97%E6%B3%95%E4%B8%93%E9%A2%98.ppt">网络流算法专题.ppt</a></p>
</blockquote>
<p>而关于GAP优化，我们需要一个GAP数组记录每层的节点数，当一个层的节点数变为零时，即分层图中出现了空隙，在GAP以上的所有点的预流已经不可能成为可行流，那就将它们从队列中取出，并将它们的高度修改为size以免再次被加入队列。</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#75715e">//JLOI2010 champion.cpp
</span><span style="color:#75715e"></span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;algorithm&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;iostream&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstring&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdlib&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdio&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;string&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;vector&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cmath&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;queue&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;stack&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;map&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;set&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span>
<span style="color:#75715e">//#define LOCAL
</span><span style="color:#75715e"></span><span style="color:#75715e">#define READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define READ_FILE
</span><span style="color:#75715e">//#define VISUAL_STUDIO
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXN <span style="color:#f92672">=</span> <span style="color:#ae81ff">310</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXM <span style="color:#f92672">=</span> <span style="color:#ae81ff">100000</span>;

<span style="color:#75715e">#ifdef LOCAL
</span><span style="color:#75715e">#define LOCAL_TIME
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define LOCAL_DEBUG
</span><span style="color:#75715e">//#define STD_DEBUG
</span><span style="color:#75715e">//#define DATA
</span><span style="color:#75715e"></span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef VISUAL_STUDIO
</span><span style="color:#75715e">#pragma warning(disable: 4996)
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;ctime&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#66d9ef">char</span> fread_char;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">fread_init</span>()
{
    fread_char <span style="color:#f92672">=</span> getchar();
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">get_int</span>()
{
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">while</span> ((fread_char <span style="color:#f92672">&lt;</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">||</span> (fread_char <span style="color:#f92672">&gt;</span> <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        fread_char <span style="color:#f92672">=</span> getchar();
    }
    <span style="color:#66d9ef">while</span> ((fread_char <span style="color:#f92672">&gt;=</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (fread_char <span style="color:#f92672">&lt;=</span> <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        ret <span style="color:#f92672">=</span> ret <span style="color:#f92672">*</span> <span style="color:#ae81ff">10</span> <span style="color:#f92672">+</span> fread_char <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;0&#39;</span>;
        fread_char <span style="color:#f92672">=</span> getchar();
    }
    <span style="color:#66d9ef">return</span> ret;
}
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">read</span>(<span style="color:#66d9ef">int</span> <span style="color:#f92672">&amp;</span>a)
{
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>    a <span style="color:#f92672">=</span> get_int();
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>    scanf(<span style="color:#e6db74">&#34;%d&#34;</span>, <span style="color:#f92672">&amp;</span>a);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#66d9ef">int</span> n, m;
<span style="color:#66d9ef">int</span> k;
<span style="color:#66d9ef">int</span> s, t;
<span style="color:#66d9ef">int</span> x, y;
<span style="color:#66d9ef">int</span> map[MAXN][MAXN];

<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">node_node</span>
{
    <span style="color:#66d9ef">int</span> id, height;
    <span style="color:#66d9ef">inline</span> <span style="color:#a6e22e">node_node</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> id_ <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> height_ <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>)
    {
        id <span style="color:#f92672">=</span> id_;
        height <span style="color:#f92672">=</span> height_;
    }
    <span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">bool</span> <span style="color:#66d9ef">operator</span> <span style="color:#f92672">&lt;</span> (<span style="color:#66d9ef">const</span> node_node <span style="color:#f92672">&amp;</span>b) <span style="color:#66d9ef">const</span>
    {
        <span style="color:#66d9ef">return</span> height <span style="color:#f92672">&lt;</span> b.height;
    }
};

<span style="color:#66d9ef">bool</span> visit[MAXN];
<span style="color:#66d9ef">int</span> inflow[MAXN], height[MAXN];
std<span style="color:#f92672">::</span>priority_queue <span style="color:#f92672">&lt;</span>node_node<span style="color:#f92672">&gt;</span> Q;

<span style="color:#66d9ef">int</span> gap[MAXN];

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">add_edge</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> u, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> v, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> d, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">bool</span> both_way <span style="color:#f92672">=</span> false)
{
    map[u][v] <span style="color:#f92672">=</span> d;
    map[v][u] <span style="color:#f92672">=</span> both_way <span style="color:#f92672">?</span> d : <span style="color:#ae81ff">0</span>;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">bfs</span>()
{
    std<span style="color:#f92672">::</span>queue <span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> bfs_q;
    bfs_q.push(t);
    <span style="color:#66d9ef">int</span> tmp;
    gap[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
    <span style="color:#66d9ef">while</span> (<span style="color:#f92672">!</span>bfs_q.empty())
    {
        tmp <span style="color:#f92672">=</span> bfs_q.front();
        bfs_q.pop();
        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> s; i <span style="color:#f92672">&lt;=</span> t; i<span style="color:#f92672">++</span>)
        {
            <span style="color:#66d9ef">if</span> ((<span style="color:#f92672">!</span>visit[i]) <span style="color:#f92672">&amp;&amp;</span> (map[i][tmp] <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>))
            {
                height[i] <span style="color:#f92672">=</span> height[tmp] <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
                gap[height[i]]<span style="color:#f92672">++</span>;
                visit[i] <span style="color:#f92672">=</span> true;
                bfs_q.push(i);
            }
        }
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">max_flow</span>()
{
    memset(visit, false, <span style="color:#66d9ef">sizeof</span>(visit));
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> s <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;</span> t; i<span style="color:#f92672">++</span>)
    {
        <span style="color:#66d9ef">if</span> (map[s][i] <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>)
        {
            inflow[i] <span style="color:#f92672">=</span> map[s][i];
            map[i][s] <span style="color:#f92672">+=</span> inflow[i];
            map[s][i] <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
            Q.push(node_node(i, height[i]));
            visit[i] <span style="color:#f92672">=</span> true;
        }
    }
    node_node tmp;
    <span style="color:#66d9ef">int</span> push_flow <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
    <span style="color:#66d9ef">int</span> min_height <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
    visit[t] <span style="color:#f92672">=</span> true;
    <span style="color:#66d9ef">while</span> (<span style="color:#f92672">!</span>Q.empty())
    {
        tmp <span style="color:#f92672">=</span> Q.top();
        Q.pop();
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>        printf(<span style="color:#e6db74">&#34;POP ID HEIGHT INFLOW: %d %d %dn&#34;</span>, tmp.id, tmp.height, inflow[tmp.id]);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>        visit[tmp.id] <span style="color:#f92672">=</span> false;
        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> s <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>; (i <span style="color:#f92672">&lt;=</span> t) <span style="color:#f92672">&amp;&amp;</span> (inflow[tmp.id] <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>); i<span style="color:#f92672">++</span>)
        {
            <span style="color:#66d9ef">if</span> ((height[tmp.id] <span style="color:#f92672">==</span> height[i] <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>) <span style="color:#f92672">&amp;&amp;</span> (map[tmp.id][i] <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>))
            {
                push_flow <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>min(inflow[tmp.id], map[tmp.id][i]);
                inflow[tmp.id] <span style="color:#f92672">-=</span> push_flow;
                inflow[i] <span style="color:#f92672">+=</span> push_flow;
                map[tmp.id][i] <span style="color:#f92672">-=</span> push_flow;
                map[i][tmp.id] <span style="color:#f92672">+=</span> push_flow;
                <span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span>visit[i])
                {
                    Q.push(node_node(i, height[i]));
                    visit[i] <span style="color:#f92672">=</span> true;
                }
            }
        }
        min_height <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
        <span style="color:#66d9ef">if</span> ((inflow[tmp.id] <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>) <span style="color:#f92672">&amp;&amp;</span> (tmp.id <span style="color:#f92672">!=</span> t))
        {
            <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> s <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;=</span> t; i<span style="color:#f92672">++</span>)
            {
                <span style="color:#66d9ef">if</span> (map[tmp.id][i] <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>)
                {
                    <span style="color:#66d9ef">if</span> ((min_height <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>) <span style="color:#f92672">||</span> (height[i] <span style="color:#f92672">&lt;</span> min_height))
                    {
                        min_height <span style="color:#f92672">=</span> height[i];
                    }
                }
            }
            <span style="color:#66d9ef">if</span> ((min_height <span style="color:#f92672">!=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>) <span style="color:#f92672">&amp;&amp;</span> (min_height <span style="color:#f92672">&lt;</span> t))
            {
                gap[height[tmp.id]]<span style="color:#f92672">--</span>;
                <span style="color:#66d9ef">if</span> (gap[height[tmp.id]] <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>)
                {
                    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> s; i <span style="color:#f92672">&lt;=</span> t; i<span style="color:#f92672">++</span>)
                    {
                        <span style="color:#66d9ef">if</span> ((height[i] <span style="color:#f92672">&gt;=</span> height[tmp.id]) <span style="color:#f92672">&amp;&amp;</span> (height[i] <span style="color:#f92672">&lt;</span> t))
                        {
                            gap[height[i]]<span style="color:#f92672">--</span>;
                            height[i] <span style="color:#f92672">=</span> t;
                            <span style="color:#66d9ef">if</span> (visit[i])
                            {
                                Q.pop();
                            }
                        }
                    }
                }
                gap[height[tmp.id] <span style="color:#f92672">=</span> min_height <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>]<span style="color:#f92672">++</span>;
                Q.push(node_node(tmp.id, height[tmp.id]));
                visit[tmp.id] <span style="color:#f92672">=</span> true;
            }
        }
    }
    <span style="color:#66d9ef">return</span> inflow[t];
}

<span style="color:#75715e">#ifndef DATA
</span><span style="color:#75715e"></span><span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">long</span> <span style="color:#66d9ef">long</span> start_time_ <span style="color:#f92672">=</span> clock();
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;champion.in&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>, stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;champion.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    read(n);
    read(m);
    s <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
    t <span style="color:#f92672">=</span> n <span style="color:#f92672">+</span> <span style="color:#ae81ff">2</span>;
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;=</span> n; i<span style="color:#f92672">++</span>)
    {
        scanf(<span style="color:#e6db74">&#34;%d&#34;</span>, <span style="color:#f92672">&amp;</span>k);
        <span style="color:#66d9ef">if</span> (k <span style="color:#f92672">==</span> <span style="color:#ae81ff">1</span>)
        {
            add_edge(s, i <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, <span style="color:#ae81ff">1</span>);
        }
        <span style="color:#66d9ef">else</span>
        {
            add_edge(i <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, t, <span style="color:#ae81ff">1</span>);
        }
    }
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> m; i<span style="color:#f92672">++</span>)
    {
        read(x);
        read(y);
        add_edge(x <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, y <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, <span style="color:#ae81ff">1</span>, true);
    }
    bfs();
    printf(<span style="color:#e6db74">&#34;%d&#34;</span>, max_flow());
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    printf(<span style="color:#e6db74">&#34;nrun time: %lld msn&#34;</span>, clock() <span style="color:#f92672">-</span> start_time_);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    fclose(stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>    fclose(stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
}
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span><span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
    <span style="color:#66d9ef">int</span> N <span style="color:#f92672">=</span> <span style="color:#ae81ff">300</span>;
    <span style="color:#66d9ef">int</span> M <span style="color:#f92672">=</span> <span style="color:#ae81ff">44850</span>;
    <span style="color:#66d9ef">int</span> RAND_BASE <span style="color:#f92672">=</span> <span style="color:#ae81ff">32</span>;
    freopen(<span style="color:#e6db74">&#34;champion.in&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
    srand(RAND_BASE);
    printf(<span style="color:#e6db74">&#34;%d %dn&#34;</span>, N, M);
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> N; i<span style="color:#f92672">++</span>)
    {
        printf(<span style="color:#e6db74">&#34;%d &#34;</span>, rand() <span style="color:#f92672">%</span> <span style="color:#ae81ff">2</span>);
    }
    printf(<span style="color:#e6db74">&#34;n&#34;</span>);
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> M; i<span style="color:#f92672">++</span>)
    {
        <span style="color:#66d9ef">int</span> x <span style="color:#f92672">=</span> rand() <span style="color:#f92672">%</span> N <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
        <span style="color:#66d9ef">int</span> y <span style="color:#f92672">=</span> rand() <span style="color:#f92672">%</span> N <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
        <span style="color:#66d9ef">if</span> (x <span style="color:#f92672">==</span> y)
        {
            i<span style="color:#f92672">--</span>;
            <span style="color:#66d9ef">continue</span>;
        }
        printf(<span style="color:#e6db74">&#34;%d %dn&#34;</span>, x, y);
    }
    fclose(stdout);
    <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
}
<span style="color:#75715e">#endif
</span></code></pre></div>]]></content></item><item><title>[BZOJ3595][SCOI2014]方伯伯的OJ（MAP + SPLAY）</title><link>https://www.sxn.dev/posts/scoi2014-oj/</link><pubDate>Mon, 19 May 2014 18:50:52 +0000</pubDate><guid>https://www.sxn.dev/posts/scoi2014-oj/</guid><description>&lt;p>这道题实在是坑爹，比赛的时候一度以为要两个MAP两棵SPLAY，然后感觉写着蛋疼就写了一个SPLAY 40分滚粗了。后来重新看题，发现其实AC算法也只要一个SPLAY就好了，还有一个SPLAY也可以用MAP来代替（在此BS一下PASCAL，问PASCAL党做这种题该怎么办）。&lt;/p></description><content type="html"><![CDATA[<p>这道题实在是坑爹，比赛的时候一度以为要两个MAP两棵SPLAY，然后感觉写着蛋疼就写了一个SPLAY 40分滚粗了。后来重新看题，发现其实AC算法也只要一个SPLAY就好了，还有一个SPLAY也可以用MAP来代替（在此BS一下PASCAL，问PASCAL党做这种题该怎么办）。</p>
<p>首先我们要考虑第一个操作，我们肯定是不能在SPLAY里改编号的，所以说需要两个MAP来维护用户编号的修改，一个MAP将初始编号映射到修改后的编号，另一个将修改后的编号映射到初始编号，这样每次操作的时候就转成初始编号，输出的时候再转成修改后的编号即可。</p>
<p>然后我们来考虑排名的维护。因为N有(10^8)空间根本开不下，所以时空复杂度一定是关于M的。事实上，我们不需要维护所有的用户，因为只有M个操作，所以至多只有M个用户会被操作到，那么剩下的用户就可以合并起来了。但是这道题强制在线，所以我们不能一开始就分好组，只能在操作的过程中分。初始情况下SPLAY中只有一个节点包含[1, n]整个区间，当我们需要移动一个编号为i用户时，我们就将这个节点拆分成[1, i-1]、[i, i]、[i+1, n]三个节点，然后就可以进行操作了。这样做的话排名已经能很好地维护了，但是我没有办法通过用户的编号找到用户所在的SPLAY节点，所以原来我考虑再开一个相似的SPLAY，只是根据节点编号来维护，每个节点再映射到原SPLAY上相应的节点。后来我发现每个SPLAY节点区间的右端点r是唯一的，而MAP是可以做二分查找的，所以只要再开一个节点维护区间右端点r到SPLAY节点的映射，每次操作时用lower_bound查找（lower_bound(x)返回大于等于x的迭代器，而uper_bound(x)返回大于x的迭代器，很显然这里需要用lower_bound）。这样就做完了。然后一开始我开了10W + 10个节点结果RE了，我还以为写渣，后来开到14W就A了，因为最多有10W个节点要被操作，那么最多会有20W + 1个区间，然后再除去一些查询操作，总之10W一定是不够的。</p>
<p>最后莫名其妙还拿了个RANK1（虽然就那么几个人A了）。</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#75715e">//SCOI2014 oj.cpp
</span><span style="color:#75715e"></span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;algorithm&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;iostream&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstring&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdlib&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;string&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdio&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;vector&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cmath&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;queue&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;stack&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;map&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;set&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span>
<span style="color:#75715e">//#define LOCAL
</span><span style="color:#75715e">//#define READ_FILE
</span><span style="color:#75715e"></span><span style="color:#75715e">#define READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define VISUAL_STUDIO
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXM <span style="color:#f92672">=</span> <span style="color:#ae81ff">140000</span>;

<span style="color:#75715e">#ifdef LOCAL
</span><span style="color:#75715e">#define LOCAL_TIME
</span><span style="color:#75715e">#define LOCAL_DEBUG
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define STD_DEBUG
</span><span style="color:#75715e"></span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;ctime&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef VISUAL_STUDIO
</span><span style="color:#75715e">#pragma warning(disable: 4996)
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#66d9ef">char</span> fread_char;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">fread_init</span>()
{
    fread_char <span style="color:#f92672">=</span> getchar();
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">get_int</span>()
{
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">while</span> ((fread_char <span style="color:#f92672">&lt;</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">||</span> (fread_char <span style="color:#f92672">&gt;</span> <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        fread_char <span style="color:#f92672">=</span> getchar();
    }
    <span style="color:#66d9ef">while</span> ((fread_char <span style="color:#f92672">&gt;=</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (fread_char <span style="color:#f92672">&lt;=</span> <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        ret <span style="color:#f92672">=</span> ret <span style="color:#f92672">*</span> <span style="color:#ae81ff">10</span> <span style="color:#f92672">+</span> fread_char <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;0&#39;</span>;
        fread_char <span style="color:#f92672">=</span> getchar();
    }
    <span style="color:#66d9ef">return</span> ret;
}
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">read</span>(<span style="color:#66d9ef">int</span> <span style="color:#f92672">&amp;</span>a)
{
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>    a <span style="color:#f92672">=</span> get_int();
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>    scanf(<span style="color:#e6db74">&#34;%d&#34;</span>, <span style="color:#f92672">&amp;</span>a);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#66d9ef">int</span> n, m;
<span style="color:#66d9ef">int</span> a;
<span style="color:#66d9ef">int</span> op;
<span style="color:#66d9ef">int</span> x, y, k;
std<span style="color:#f92672">::</span>map <span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span>, <span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> id_to_num;
std<span style="color:#f92672">::</span>map <span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span>, <span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> num_to_id;
std<span style="color:#f92672">::</span>map <span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span>, <span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">::</span>iterator tmp;
std<span style="color:#f92672">::</span>map <span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span>, <span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> interval_to_splay;

<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">splay_node</span>
{
    <span style="color:#66d9ef">int</span> l, r;
    splay_node <span style="color:#f92672">*</span>l_child, <span style="color:#f92672">*</span>r_child, <span style="color:#f92672">*</span>parent;
    <span style="color:#66d9ef">int</span> size;
    <span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">init</span>()
    {
        l_child <span style="color:#f92672">=</span> r_child <span style="color:#f92672">=</span> parent <span style="color:#f92672">=</span> NULL;
        <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">this</span>;
    }
};

splay_node recover_splay_node[MAXM];
splay_node <span style="color:#f92672">*</span>stack_recover_splay_node[MAXM];
<span style="color:#66d9ef">int</span> top_stack_recover_splay_node <span style="color:#f92672">=</span> MAXM;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">recover_splay_init</span>()
{
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> MAXM; i<span style="color:#f92672">++</span>)
    {
        stack_recover_splay_node[i] <span style="color:#f92672">=</span> recover_splay_node <span style="color:#f92672">+</span> i;
    }
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">new_node</span>()
{
    <span style="color:#66d9ef">return</span> stack_recover_splay_node[<span style="color:#f92672">--</span>top_stack_recover_splay_node]<span style="color:#f92672">-&gt;</span>init();
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">delete_node</span>(splay_node <span style="color:#f92672">*</span>del_node)
{
    stack_recover_splay_node[top_stack_recover_splay_node<span style="color:#f92672">++</span>] <span style="color:#f92672">=</span> del_node;
}

splay_node <span style="color:#f92672">*</span>splay_head;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">attach_as_l_child</span>(splay_node <span style="color:#f92672">*</span>parent, splay_node <span style="color:#f92672">*</span>child)
{
    parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> child;
    <span style="color:#66d9ef">if</span> (child <span style="color:#f92672">!=</span> NULL)
    {
        child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">attach_as_r_child</span>(splay_node <span style="color:#f92672">*</span>parent, splay_node <span style="color:#f92672">*</span>child)
{
    parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> child;
    <span style="color:#66d9ef">if</span> (child <span style="color:#f92672">!=</span> NULL)
    {
        child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">splay_size</span>(splay_node <span style="color:#f92672">*</span>query_node)
{
    <span style="color:#66d9ef">if</span> (query_node <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
    }
    <span style="color:#66d9ef">return</span> query_node<span style="color:#f92672">-&gt;</span>size;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_update_size</span>(splay_node <span style="color:#f92672">*</span>update_node)
{
    update_node<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> splay_size(update_node<span style="color:#f92672">-&gt;</span>l_child) <span style="color:#f92672">+</span> splay_size(update_node<span style="color:#f92672">-&gt;</span>r_child) <span style="color:#f92672">+</span> update_node<span style="color:#f92672">-&gt;</span>r <span style="color:#f92672">-</span> update_node<span style="color:#f92672">-&gt;</span>l <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_zig</span>(splay_node <span style="color:#f92672">*</span>axis)
{
    splay_node <span style="color:#f92672">*</span>left_child <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>l_child;
    splay_node <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>parent;
    attach_as_l_child(axis, left_child<span style="color:#f92672">-&gt;</span>r_child);
    attach_as_r_child(left_child, axis);
    left_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    <span style="color:#66d9ef">if</span> (parent <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> axis)
        {
            parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> left_child;
        }
        <span style="color:#66d9ef">else</span>
        {
            parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> left_child;
        }
    }
    left_child<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>size;
    splay_update_size(axis);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_zag</span>(splay_node <span style="color:#f92672">*</span>axis)
{
    splay_node <span style="color:#f92672">*</span>right_child <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>r_child;
    splay_node <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>parent;
    attach_as_r_child(axis, right_child<span style="color:#f92672">-&gt;</span>l_child);
    attach_as_l_child(right_child, axis);
    right_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    <span style="color:#66d9ef">if</span> (parent <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> axis)
        {
            parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> right_child;
        }
        <span style="color:#66d9ef">else</span>
        {
            parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> right_child;
        }
    }
    right_child<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>size;
    splay_update_size(axis);
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_route</span>(splay_node <span style="color:#f92672">*</span>v)
{
    splay_node <span style="color:#f92672">*</span>parent, <span style="color:#f92672">*</span>grand_parent;
    <span style="color:#66d9ef">while</span> (((parent <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>parent) <span style="color:#f92672">!=</span> NULL) <span style="color:#f92672">&amp;&amp;</span> ((grand_parent <span style="color:#f92672">=</span> parent<span style="color:#f92672">-&gt;</span>parent) <span style="color:#f92672">!=</span> NULL))
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> v)
        {
            <span style="color:#66d9ef">if</span> (grand_parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> parent)
            {
                splay_zig(grand_parent);
                splay_zig(parent);
            }
            <span style="color:#66d9ef">else</span>
            {
                splay_zig(parent);
                splay_zag(grand_parent);
            }
        }
        <span style="color:#66d9ef">else</span>
        {
            <span style="color:#66d9ef">if</span> (grand_parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">==</span> parent)
            {
                splay_zag(grand_parent);
                splay_zag(parent);
            }
            <span style="color:#66d9ef">else</span>
            {
                splay_zag(parent);
                splay_zig(grand_parent);
            }
        }
    }
    <span style="color:#66d9ef">if</span> ((parent <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>parent) <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> v)
        {
            splay_zig(parent);
        }
        <span style="color:#66d9ef">else</span>
        {
            splay_zag(parent);
        }
    }
    <span style="color:#66d9ef">return</span> v;
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_bottom</span>(splay_node <span style="color:#f92672">*</span>v <span style="color:#f92672">=</span> splay_head)
{
    <span style="color:#66d9ef">while</span> (v <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (v<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">==</span> NULL)
        {
            <span style="color:#66d9ef">return</span> v;
        }
        <span style="color:#66d9ef">else</span>
        {
            v <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>r_child;
        }
    }
    <span style="color:#66d9ef">return</span> NULL;
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_top</span>(splay_node <span style="color:#f92672">*</span>v <span style="color:#f92672">=</span> splay_head)
{
    <span style="color:#66d9ef">while</span> (v <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (v<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> NULL)
        {
            <span style="color:#66d9ef">return</span> v;
        }
        <span style="color:#66d9ef">else</span>
        {
            v <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>l_child;
        }
    }
    <span style="color:#66d9ef">return</span> NULL;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_init</span>()
{
    splay_head <span style="color:#f92672">=</span> new_node();
    splay_head<span style="color:#f92672">-&gt;</span>l <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
    splay_head<span style="color:#f92672">-&gt;</span>r <span style="color:#f92672">=</span> n;
    splay_head<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> splay_head<span style="color:#f92672">-&gt;</span>r <span style="color:#f92672">-</span> splay_head<span style="color:#f92672">-&gt;</span>l <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
    interval_to_splay.insert(std<span style="color:#f92672">::</span>pair <span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span>, <span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span>(n, splay_head <span style="color:#f92672">-</span> recover_splay_node));
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">get_num_by_id</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> id)
{
    tmp <span style="color:#f92672">=</span> id_to_num.find(id);
    <span style="color:#66d9ef">if</span> (tmp <span style="color:#f92672">==</span> id_to_num.end())
    {
        <span style="color:#66d9ef">return</span> id;
    }
    <span style="color:#66d9ef">return</span> tmp<span style="color:#f92672">-&gt;</span>second;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">get_id_by_num</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> num)
{
    tmp <span style="color:#f92672">=</span> num_to_id.find(num);
    <span style="color:#66d9ef">if</span> (tmp <span style="color:#f92672">==</span> num_to_id.end())
    {
        <span style="color:#66d9ef">return</span> num;
    }
    <span style="color:#66d9ef">return</span> tmp<span style="color:#f92672">-&gt;</span>second;
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">get_splay_by_num</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> num)
{
    tmp <span style="color:#f92672">=</span> interval_to_splay.lower_bound(num);
    <span style="color:#66d9ef">return</span> recover_splay_node <span style="color:#f92672">+</span> tmp<span style="color:#f92672">-&gt;</span>second;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">splay_get_rank</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> id)
{
    <span style="color:#66d9ef">int</span> num <span style="color:#f92672">=</span> get_num_by_id(id);
    splay_head <span style="color:#f92672">=</span> splay_route(get_splay_by_num(num));
    <span style="color:#66d9ef">return</span> splay_size(splay_head<span style="color:#f92672">-&gt;</span>l_child) <span style="color:#f92672">+</span> num <span style="color:#f92672">-</span> splay_head<span style="color:#f92672">-&gt;</span>l <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">map_change</span>(<span style="color:#66d9ef">int</span> x, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> y)
{
    tmp <span style="color:#f92672">=</span> id_to_num.find(x);
    <span style="color:#66d9ef">if</span> (tmp <span style="color:#f92672">!=</span> id_to_num.end())
    {
        x <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>second;
        id_to_num.erase(tmp);
        tmp <span style="color:#f92672">=</span> num_to_id.find(x);
        num_to_id.erase(tmp);
    }
    id_to_num.insert(std<span style="color:#f92672">::</span>pair <span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span>, <span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span>(y, x));
    num_to_id.insert(std<span style="color:#f92672">::</span>pair <span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span>, <span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span>(x, y));
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">splay_move_to_top</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> id)
{
    <span style="color:#66d9ef">int</span> num <span style="color:#f92672">=</span> get_num_by_id(id);
    tmp <span style="color:#f92672">=</span> interval_to_splay.lower_bound(num);
    splay_head <span style="color:#f92672">=</span> splay_route(recover_splay_node <span style="color:#f92672">+</span> tmp<span style="color:#f92672">-&gt;</span>second);
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> splay_size(splay_head<span style="color:#f92672">-&gt;</span>l_child) <span style="color:#f92672">+</span> num <span style="color:#f92672">-</span> splay_head<span style="color:#f92672">-&gt;</span>l <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
    splay_node <span style="color:#f92672">*</span>move_node <span style="color:#f92672">=</span> NULL;
    <span style="color:#66d9ef">if</span> (splay_head<span style="color:#f92672">-&gt;</span>l <span style="color:#f92672">==</span> splay_head<span style="color:#f92672">-&gt;</span>r)
    {
        move_node <span style="color:#f92672">=</span> splay_head;
        <span style="color:#66d9ef">if</span> (splay_head<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> NULL)
        {
            splay_head<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> NULL;
            splay_head <span style="color:#f92672">=</span> splay_head<span style="color:#f92672">-&gt;</span>r_child;
        }
        <span style="color:#66d9ef">else</span>
        {
            splay_head<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> NULL;
            splay_node <span style="color:#f92672">*</span>new_root <span style="color:#f92672">=</span> splay_route(splay_bottom(splay_head<span style="color:#f92672">-&gt;</span>l_child));
            attach_as_r_child(new_root, splay_head<span style="color:#f92672">-&gt;</span>r_child);
            splay_update_size(new_root);
            splay_head <span style="color:#f92672">=</span> new_root;
        }
        move_node<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> move_node<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> NULL;
        move_node<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
    }
    <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (splay_head<span style="color:#f92672">-&gt;</span>l <span style="color:#f92672">==</span> num)
    {
        move_node <span style="color:#f92672">=</span> new_node();
        move_node<span style="color:#f92672">-&gt;</span>l <span style="color:#f92672">=</span> move_node<span style="color:#f92672">-&gt;</span>r <span style="color:#f92672">=</span> num;
        move_node<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
        interval_to_splay.insert(std<span style="color:#f92672">::</span>pair <span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span>, <span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span>(num, move_node <span style="color:#f92672">-</span> recover_splay_node));
        splay_head<span style="color:#f92672">-&gt;</span>l <span style="color:#f92672">=</span> num <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
        splay_head<span style="color:#f92672">-&gt;</span>size<span style="color:#f92672">--</span>;
    }
    <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (splay_head<span style="color:#f92672">-&gt;</span>r <span style="color:#f92672">==</span> num)
    {
        move_node <span style="color:#f92672">=</span> new_node();
        move_node<span style="color:#f92672">-&gt;</span>l <span style="color:#f92672">=</span> move_node<span style="color:#f92672">-&gt;</span>r <span style="color:#f92672">=</span> num;
        move_node<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
        interval_to_splay.erase(tmp);
        interval_to_splay.insert(std<span style="color:#f92672">::</span>pair <span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span>, <span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span>(num <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>, splay_head <span style="color:#f92672">-</span> recover_splay_node));
        interval_to_splay.insert(std<span style="color:#f92672">::</span>pair <span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span>, <span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span>(num, move_node <span style="color:#f92672">-</span> recover_splay_node));
        splay_head<span style="color:#f92672">-&gt;</span>r <span style="color:#f92672">=</span> num <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>;
        splay_head<span style="color:#f92672">-&gt;</span>size<span style="color:#f92672">--</span>;
    }
    <span style="color:#66d9ef">else</span>
    {
        move_node <span style="color:#f92672">=</span> new_node();
        move_node<span style="color:#f92672">-&gt;</span>l <span style="color:#f92672">=</span> move_node<span style="color:#f92672">-&gt;</span>r <span style="color:#f92672">=</span> num;
        move_node<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
        interval_to_splay.erase(tmp);
        interval_to_splay.insert(std<span style="color:#f92672">::</span>pair <span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span>, <span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span>(num, move_node <span style="color:#f92672">-</span> recover_splay_node));
        splay_node <span style="color:#f92672">*</span>splite_right <span style="color:#f92672">=</span> new_node();
        splite_right<span style="color:#f92672">-&gt;</span>l <span style="color:#f92672">=</span> num <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
        splite_right<span style="color:#f92672">-&gt;</span>r <span style="color:#f92672">=</span> splay_head<span style="color:#f92672">-&gt;</span>r;
        interval_to_splay.insert(std<span style="color:#f92672">::</span>pair <span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span>, <span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span>(splite_right<span style="color:#f92672">-&gt;</span>r, splite_right <span style="color:#f92672">-</span> recover_splay_node));
        interval_to_splay.insert(std<span style="color:#f92672">::</span>pair <span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span>, <span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span>(num <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>, splay_head <span style="color:#f92672">-</span> recover_splay_node));
        splay_head<span style="color:#f92672">-&gt;</span>r <span style="color:#f92672">=</span> num <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>;
        splay_head<span style="color:#f92672">-&gt;</span>size<span style="color:#f92672">--</span>;
        attach_as_r_child(splite_right, splay_head<span style="color:#f92672">-&gt;</span>r_child);
        attach_as_r_child(splay_head, splite_right);
        splay_update_size(splite_right);
    }
    splay_head <span style="color:#f92672">=</span> splay_route(splay_top());
    attach_as_l_child(splay_head, move_node);
    splay_head<span style="color:#f92672">-&gt;</span>size<span style="color:#f92672">++</span>;
    <span style="color:#66d9ef">return</span> ret;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">splay_move_to_bottom</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> id)
{
    <span style="color:#66d9ef">int</span> num <span style="color:#f92672">=</span> get_num_by_id(id);
    tmp <span style="color:#f92672">=</span> interval_to_splay.lower_bound(num);
    splay_head <span style="color:#f92672">=</span> splay_route(recover_splay_node <span style="color:#f92672">+</span> tmp<span style="color:#f92672">-&gt;</span>second);
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> splay_size(splay_head<span style="color:#f92672">-&gt;</span>l_child) <span style="color:#f92672">+</span> num <span style="color:#f92672">-</span> splay_head<span style="color:#f92672">-&gt;</span>l <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
    splay_node <span style="color:#f92672">*</span>move_node <span style="color:#f92672">=</span> NULL;
    <span style="color:#66d9ef">if</span> (splay_head<span style="color:#f92672">-&gt;</span>l <span style="color:#f92672">==</span> splay_head<span style="color:#f92672">-&gt;</span>r)
    {
        move_node <span style="color:#f92672">=</span> splay_head;
        <span style="color:#66d9ef">if</span> (splay_head<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> NULL)
        {
            splay_head<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> NULL;
            splay_head <span style="color:#f92672">=</span> splay_head<span style="color:#f92672">-&gt;</span>r_child;
        }
        <span style="color:#66d9ef">else</span>
        {
            splay_head<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> NULL;
            splay_node <span style="color:#f92672">*</span>new_root <span style="color:#f92672">=</span> splay_route(splay_bottom(splay_head<span style="color:#f92672">-&gt;</span>l_child));
            attach_as_r_child(new_root, splay_head<span style="color:#f92672">-&gt;</span>r_child);
            splay_update_size(new_root);
            splay_head <span style="color:#f92672">=</span> new_root;
        }
        move_node<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> move_node<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> NULL;
    }
    <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (splay_head<span style="color:#f92672">-&gt;</span>l <span style="color:#f92672">==</span> num)
    {
        move_node <span style="color:#f92672">=</span> new_node();
        move_node<span style="color:#f92672">-&gt;</span>l <span style="color:#f92672">=</span> move_node<span style="color:#f92672">-&gt;</span>r <span style="color:#f92672">=</span> num;
        move_node<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
        interval_to_splay.insert(std<span style="color:#f92672">::</span>pair <span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span>, <span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span>(num, move_node <span style="color:#f92672">-</span> recover_splay_node));
        splay_head<span style="color:#f92672">-&gt;</span>l <span style="color:#f92672">=</span> num <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
        splay_head<span style="color:#f92672">-&gt;</span>size<span style="color:#f92672">--</span>;
    }
    <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (splay_head<span style="color:#f92672">-&gt;</span>r <span style="color:#f92672">==</span> num)
    {
        move_node <span style="color:#f92672">=</span> new_node();
        move_node<span style="color:#f92672">-&gt;</span>l <span style="color:#f92672">=</span> move_node<span style="color:#f92672">-&gt;</span>r <span style="color:#f92672">=</span> num;
        move_node<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
        interval_to_splay.erase(tmp);
        interval_to_splay.insert(std<span style="color:#f92672">::</span>pair <span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span>, <span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span>(num <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>, splay_head <span style="color:#f92672">-</span> recover_splay_node));
        interval_to_splay.insert(std<span style="color:#f92672">::</span>pair <span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span>, <span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span>(num, move_node <span style="color:#f92672">-</span> recover_splay_node));
        splay_head<span style="color:#f92672">-&gt;</span>r <span style="color:#f92672">=</span> num <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>;
        splay_head<span style="color:#f92672">-&gt;</span>size<span style="color:#f92672">--</span>;
    }
    <span style="color:#66d9ef">else</span>
    {
        move_node <span style="color:#f92672">=</span> new_node();
        move_node<span style="color:#f92672">-&gt;</span>l <span style="color:#f92672">=</span> move_node<span style="color:#f92672">-&gt;</span>r <span style="color:#f92672">=</span> num;
        move_node<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
        interval_to_splay.erase(tmp);
        interval_to_splay.insert(std<span style="color:#f92672">::</span>pair <span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span>, <span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span>(num, move_node <span style="color:#f92672">-</span> recover_splay_node));
        splay_node <span style="color:#f92672">*</span>splite_right <span style="color:#f92672">=</span> new_node();
        splite_right<span style="color:#f92672">-&gt;</span>l <span style="color:#f92672">=</span> num <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
        splite_right<span style="color:#f92672">-&gt;</span>r <span style="color:#f92672">=</span> splay_head<span style="color:#f92672">-&gt;</span>r;
        interval_to_splay.insert(std<span style="color:#f92672">::</span>pair <span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span>, <span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span>(splite_right<span style="color:#f92672">-&gt;</span>r, splite_right <span style="color:#f92672">-</span> recover_splay_node));
        interval_to_splay.insert(std<span style="color:#f92672">::</span>pair <span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span>, <span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span>(num <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>, splay_head <span style="color:#f92672">-</span> recover_splay_node));
        splay_head<span style="color:#f92672">-&gt;</span>r <span style="color:#f92672">=</span> num <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>;
        splay_head<span style="color:#f92672">-&gt;</span>size<span style="color:#f92672">--</span>;
        attach_as_r_child(splite_right, splay_head<span style="color:#f92672">-&gt;</span>r_child);
        attach_as_r_child(splay_head, splite_right);
        splay_update_size(splite_right);
    }
    splay_head <span style="color:#f92672">=</span> splay_route(splay_bottom());
    attach_as_r_child(splay_head, move_node);
    splay_head<span style="color:#f92672">-&gt;</span>size<span style="color:#f92672">++</span>;
    <span style="color:#66d9ef">return</span> ret;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">splay_get_num</span>(<span style="color:#66d9ef">int</span> k)
{
    splay_node <span style="color:#f92672">*</span>v <span style="color:#f92672">=</span> splay_head;
    <span style="color:#66d9ef">int</span> left_length;
    <span style="color:#66d9ef">while</span> (v <span style="color:#f92672">!=</span> NULL)
    {
        left_length <span style="color:#f92672">=</span> splay_size(v<span style="color:#f92672">-&gt;</span>l_child);
        <span style="color:#66d9ef">if</span> (left_length <span style="color:#f92672">&lt;</span> k)
        {
            <span style="color:#66d9ef">if</span> (left_length <span style="color:#f92672">+</span> v<span style="color:#f92672">-&gt;</span>r <span style="color:#f92672">-</span> v<span style="color:#f92672">-&gt;</span>l <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">&gt;=</span> k)
            {
                <span style="color:#66d9ef">return</span> get_id_by_num(v<span style="color:#f92672">-&gt;</span>l <span style="color:#f92672">+</span> k <span style="color:#f92672">-</span> left_length <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>);
            }
            <span style="color:#66d9ef">else</span>
            {
                k <span style="color:#f92672">-=</span> left_length <span style="color:#f92672">+</span> v<span style="color:#f92672">-&gt;</span>r <span style="color:#f92672">-</span> v<span style="color:#f92672">-&gt;</span>l <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
                v <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>r_child;
            }
        }
        <span style="color:#66d9ef">else</span>
        {
            v <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>l_child;
        }
    }
    <span style="color:#66d9ef">return</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
}

<span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">long</span> <span style="color:#66d9ef">long</span> start_time_ <span style="color:#f92672">=</span> clock();
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;oj.in&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>, stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;oj.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    fread_init();
    recover_splay_init();
    read(n);
    read(m);
    splay_init();
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> m; i<span style="color:#f92672">++</span>)
    {
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>        <span style="color:#66d9ef">if</span> (i <span style="color:#f92672">==</span> <span style="color:#ae81ff">5</span>)
        {
            printf(<span style="color:#e6db74">&#34;&#34;</span>);
        }
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>        read(op);
        <span style="color:#66d9ef">if</span> (op <span style="color:#f92672">==</span> <span style="color:#ae81ff">1</span>)
        {
            read(x);
            read(y);
            x <span style="color:#f92672">-=</span> a;
            y <span style="color:#f92672">-=</span> a;
            map_change(x, y);
            printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, a <span style="color:#f92672">=</span> splay_get_rank(y));
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (op <span style="color:#f92672">==</span> <span style="color:#ae81ff">2</span>)
        {
            read(x);
            x <span style="color:#f92672">-=</span> a;
            printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, a <span style="color:#f92672">=</span> splay_move_to_top(x));
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (op <span style="color:#f92672">==</span> <span style="color:#ae81ff">3</span>)
        {
            read(x);
            x <span style="color:#f92672">-=</span> a;
            printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, a <span style="color:#f92672">=</span> splay_move_to_bottom(x));
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (op <span style="color:#f92672">==</span> <span style="color:#ae81ff">4</span>)
        {
            read(k);
            k <span style="color:#f92672">-=</span> a;
            printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, a <span style="color:#f92672">=</span> splay_get_num(k));
        }
    }
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    printf(<span style="color:#e6db74">&#34;run time: %lld msn&#34;</span>, clock() <span style="color:#f92672">-</span> start_time_);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    fclose(stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>    fclose(stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
}
</code></pre></div>]]></content></item><item><title>[BZOJ1862][ZJOI2006]GameZ游戏排名系统（SPLAY + TRIE / HASH）</title><link>https://www.sxn.dev/posts/zjoi-rank/</link><pubDate>Mon, 19 May 2014 13:01:02 +0000</pubDate><guid>https://www.sxn.dev/posts/zjoi-rank/</guid><description>传说中的双倍经验题，详见 {% post_link haoi2008-rank %}</description><content type="html">&lt;p>传说中的双倍经验题，详见 {% post_link haoi2008-rank %}&lt;/p></content></item><item><title>[BZOJ1001][BEIJING2006]狼抓兔子（最小割 + DIJKSTRA）</title><link>https://www.sxn.dev/posts/beijing2006-animal/</link><pubDate>Mon, 19 May 2014 11:20:50 +0000</pubDate><guid>https://www.sxn.dev/posts/beijing2006-animal/</guid><description>&lt;p>这道题很裸的最小割，只是数据规模大，目测会T（WJS大爷说在BZ上能过，真是跪烂了），其实最小割可以转成最短路的做法。一种做法是转成对偶图然后求最短路，当然我不会，就只好去墙角画圈圈了。不过有一天没事乱翻LRJ的白书突然就翻到了这道题（我真的只是乱翻），然后就观摩了一下题解。转什么对偶图啊。。对于这道题，由于这个图样子比较特殊，可以知道割线必然是一条从图的左边界或下边界的边出发，经过若干条边到达右边界或上边界的边，需要的狼的数量就是经过的所有边的权值和。&lt;/p></description><content type="html"><![CDATA[<p>这道题很裸的最小割，只是数据规模大，目测会T（WJS大爷说在BZ上能过，真是跪烂了），其实最小割可以转成最短路的做法。一种做法是转成对偶图然后求最短路，当然我不会，就只好去墙角画圈圈了。不过有一天没事乱翻LRJ的白书突然就翻到了这道题（我真的只是乱翻），然后就观摩了一下题解。转什么对偶图啊。。对于这道题，由于这个图样子比较特殊，可以知道割线必然是一条从图的左边界或下边界的边出发，经过若干条边到达右边界或上边界的边，需要的狼的数量就是经过的所有边的权值和。</p>
<p>下面就是建图了，把原图中所有的边建成点，将每个小直角三角形内的三条边两两相连（实际实现中不需要连起来，只要做DIJKSTRA时枚举所有相连的边即可），再建一个超级源连接所有左边界和下边界的边，一个超级汇连接所有上边界和右边界的边（实际实现中不需要建，只需将左边界和下边界的边的d都初始化为边的权值，最终的答案即为上边界和右边界的边的d的最小值），对图做最短路就行了。一开始DIJKSTRA打错一个变量名MLE了（为什么坑爹的是MLE），害得我还去改了SPFA，莫名其妙的16S AC，后来发现了错改回DIJKSTRA就4.7S了。</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#75715e">//BEIJING2006 animal.cpp
</span><span style="color:#75715e"></span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;algorithm&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;iostream&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstring&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdlib&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdio&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;string&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cmath&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;queue&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;stack&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;map&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;set&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span>
<span style="color:#75715e">//#define LOCAL
</span><span style="color:#75715e">//#define VISUAL_STUDIO
</span><span style="color:#75715e"></span><span style="color:#75715e">#define READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define READ_FILE
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXN <span style="color:#f92672">=</span> <span style="color:#ae81ff">1010</span>;

<span style="color:#75715e">#ifdef LOCAL
</span><span style="color:#75715e">#define LOCAL_TIME
</span><span style="color:#75715e">#define LOCAL_DEBUG
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef VISUAL_STUDIO
</span><span style="color:#75715e">#pragma warning(disable: 4996)
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;ctime&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#66d9ef">char</span> fread_char;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">fread_init</span>()
{
    fread_char <span style="color:#f92672">=</span> getchar();
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">get_int</span>()
{
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">while</span> ((fread_char <span style="color:#f92672">&lt;</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">||</span> (fread_char <span style="color:#f92672">&gt;</span> <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        fread_char <span style="color:#f92672">=</span> getchar();
    }
    <span style="color:#66d9ef">while</span> ((fread_char <span style="color:#f92672">&gt;=</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (fread_char <span style="color:#f92672">&lt;=</span> <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        ret <span style="color:#f92672">=</span> ret <span style="color:#f92672">*</span> <span style="color:#ae81ff">10</span> <span style="color:#f92672">+</span> fread_char <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;0&#39;</span>;
        fread_char <span style="color:#f92672">=</span> getchar();
    }
    <span style="color:#66d9ef">return</span> ret;
}
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">read</span>(<span style="color:#66d9ef">int</span> <span style="color:#f92672">&amp;</span>a)
{
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>    a <span style="color:#f92672">=</span> get_int();
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>    scanf(<span style="color:#e6db74">&#34;%d&#34;</span>, <span style="color:#f92672">&amp;</span>a);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">queue_node</span>
{
    <span style="color:#66d9ef">int</span> d;
    <span style="color:#66d9ef">int</span> type; <span style="color:#75715e">//1: row, 2: list, 3:slant
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">int</span> x, y;
    <span style="color:#66d9ef">inline</span> <span style="color:#a6e22e">queue_node</span>()
    {

    }
    <span style="color:#66d9ef">inline</span> <span style="color:#a6e22e">queue_node</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> d_, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> type_, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> x_, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> y_)
    {
        d <span style="color:#f92672">=</span> d_;
        type <span style="color:#f92672">=</span> type_;
        x <span style="color:#f92672">=</span> x_;
        y <span style="color:#f92672">=</span> y_;
    }
    <span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">bool</span> <span style="color:#66d9ef">operator</span> <span style="color:#f92672">&lt;</span> (<span style="color:#66d9ef">const</span> queue_node <span style="color:#f92672">&amp;</span>b) <span style="color:#66d9ef">const</span>
    {
        <span style="color:#66d9ef">if</span> (d <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>)
        {
            <span style="color:#66d9ef">return</span> b.d <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span> <span style="color:#f92672">?</span> false <span style="color:#f92672">:</span> true;
        }
        <span style="color:#66d9ef">else</span> <span style="color:#a6e22e">if</span> (b.d <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>)
        {
            <span style="color:#66d9ef">return</span> false;
        }
        <span style="color:#66d9ef">return</span> d <span style="color:#f92672">&gt;</span> b.d;
    }
};

<span style="color:#66d9ef">int</span> n, m;
<span style="color:#66d9ef">int</span> row[MAXN][MAXN], list[MAXN][MAXN], slant[MAXN][MAXN];
<span style="color:#66d9ef">int</span> d_row[MAXN][MAXN], d_list[MAXN][MAXN], d_slant[MAXN][MAXN];
<span style="color:#66d9ef">bool</span> visit_row[MAXN][MAXN], visit_list[MAXN][MAXN], visit_slant[MAXN][MAXN];
std<span style="color:#f92672">::</span>priority_queue <span style="color:#f92672">&lt;</span>queue_node<span style="color:#f92672">&gt;</span> Q;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">min</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> a, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> b)
{
    <span style="color:#66d9ef">if</span> (a <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>)
    {
        <span style="color:#66d9ef">return</span> b;
    }
    <span style="color:#66d9ef">if</span> (b <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>)
    {
        <span style="color:#66d9ef">return</span> a;
    }
    <span style="color:#66d9ef">return</span> a <span style="color:#f92672">&lt;</span> b <span style="color:#f92672">?</span> a : b;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">dijkstra</span>()
{
    memset(d_row, <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>, <span style="color:#66d9ef">sizeof</span>(d_row));
    memset(d_list, <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>, <span style="color:#66d9ef">sizeof</span>(d_list));
    memset(d_slant, <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>, <span style="color:#66d9ef">sizeof</span>(d_slant));
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;</span> n; i<span style="color:#f92672">++</span>)
    {
        d_list[i][<span style="color:#ae81ff">1</span>] <span style="color:#f92672">=</span> list[i][<span style="color:#ae81ff">1</span>];
        Q.push(queue_node(d_list[<span style="color:#ae81ff">1</span>][i], <span style="color:#ae81ff">2</span>, i, <span style="color:#ae81ff">1</span>));
    }
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;</span> m; i<span style="color:#f92672">++</span>)
    {
        d_row[n][i] <span style="color:#f92672">=</span> row[n][i];
        Q.push(queue_node(d_row[n][i], <span style="color:#ae81ff">1</span>, n, i));
    }
    queue_node tmp;
    <span style="color:#66d9ef">while</span> (<span style="color:#f92672">!</span>Q.empty())
    {
        tmp <span style="color:#f92672">=</span> Q.top();
        Q.pop();
        <span style="color:#66d9ef">if</span> (tmp.type <span style="color:#f92672">==</span> <span style="color:#ae81ff">1</span>)
        {
            <span style="color:#66d9ef">if</span> (visit_row[tmp.x][tmp.y])
            {
                <span style="color:#66d9ef">continue</span>;
            }
            visit_row[tmp.x][tmp.y] <span style="color:#f92672">=</span> true;
            <span style="color:#66d9ef">if</span> (tmp.x <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">1</span>)
            {
                <span style="color:#66d9ef">if</span> ((d_slant[tmp.x <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>][tmp.y] <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>) <span style="color:#f92672">||</span> (tmp.d <span style="color:#f92672">+</span> slant[tmp.x <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>][tmp.y] <span style="color:#f92672">&lt;</span> d_slant[tmp.x <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>][tmp.y]))
                {
                    d_slant[tmp.x <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>][tmp.y] <span style="color:#f92672">=</span> tmp.d <span style="color:#f92672">+</span> slant[tmp.x <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>][tmp.y];
                    Q.push(queue_node(d_slant[tmp.x <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>][tmp.y], <span style="color:#ae81ff">3</span>, tmp.x <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>, tmp.y));
                    visit_slant[tmp.x <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>][tmp.y] <span style="color:#f92672">=</span> false;
                }
                <span style="color:#66d9ef">if</span> ((d_list[tmp.x <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>][tmp.y] <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>) <span style="color:#f92672">||</span> (tmp.d <span style="color:#f92672">+</span> list[tmp.x <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>][tmp.y] <span style="color:#f92672">&lt;</span> d_list[tmp.x <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>][tmp.y]))
                {
                    d_list[tmp.x <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>][tmp.y] <span style="color:#f92672">=</span> tmp.d <span style="color:#f92672">+</span> list[tmp.x <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>][tmp.y];
                    Q.push(queue_node(d_list[tmp.x <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>][tmp.y], <span style="color:#ae81ff">2</span>, tmp.x <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>, tmp.y));
                    visit_list[tmp.x <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>][tmp.y] <span style="color:#f92672">=</span> false;
                }
            }
            <span style="color:#66d9ef">if</span> (tmp.x <span style="color:#f92672">&lt;</span> n)
            {
                <span style="color:#66d9ef">if</span> ((d_list[tmp.x][tmp.y <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>) <span style="color:#f92672">||</span> (tmp.d <span style="color:#f92672">+</span> list[tmp.x][tmp.y <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">&lt;</span> d_list[tmp.x][tmp.y <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>]))
                {
                    d_list[tmp.x][tmp.y <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">=</span> tmp.d <span style="color:#f92672">+</span> list[tmp.x][tmp.y <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>];
                    Q.push(queue_node(d_list[tmp.x][tmp.y <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>], <span style="color:#ae81ff">2</span>, tmp.x, tmp.y <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>));
                    visit_list[tmp.x][tmp.y <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">=</span> false;
                }
                <span style="color:#66d9ef">if</span> ((d_slant[tmp.x][tmp.y] <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>) <span style="color:#f92672">||</span> (tmp.d <span style="color:#f92672">+</span> slant[tmp.x][tmp.y] <span style="color:#f92672">&lt;</span> d_slant[tmp.x][tmp.y]))
                {
                    d_slant[tmp.x][tmp.y] <span style="color:#f92672">=</span> tmp.d <span style="color:#f92672">+</span> slant[tmp.x][tmp.y];
                    Q.push(queue_node(d_slant[tmp.x][tmp.y], <span style="color:#ae81ff">3</span>, tmp.x, tmp.y));
                    visit_slant[tmp.x][tmp.y] <span style="color:#f92672">=</span> false;
                }
            }
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (tmp.type <span style="color:#f92672">==</span> <span style="color:#ae81ff">2</span>)
        {
            <span style="color:#66d9ef">if</span> (visit_list[tmp.x][tmp.y])
            {
                <span style="color:#66d9ef">continue</span>;
            }
            visit_list[tmp.x][tmp.y] <span style="color:#f92672">=</span> true;
            <span style="color:#66d9ef">if</span> (tmp.y <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">1</span>)
            {
                <span style="color:#66d9ef">if</span> ((d_row[tmp.x][tmp.y <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>) <span style="color:#f92672">||</span> (tmp.d <span style="color:#f92672">+</span> row[tmp.x][tmp.y <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">&lt;</span> d_row[tmp.x][tmp.y <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>]))
                {
                    d_row[tmp.x][tmp.y <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">=</span> tmp.d <span style="color:#f92672">+</span> row[tmp.x][tmp.y <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>];
                    Q.push(queue_node(d_row[tmp.x][tmp.y <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>], <span style="color:#ae81ff">1</span>, tmp.x, tmp.y <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>));
                    visit_row[tmp.x][tmp.y <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">=</span> false;
                }
                <span style="color:#66d9ef">if</span> ((d_slant[tmp.x][tmp.y <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>) <span style="color:#f92672">||</span> (tmp.d <span style="color:#f92672">+</span> slant[tmp.x][tmp.y <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">&lt;</span> d_slant[tmp.x][tmp.y <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>]))
                {
                    d_slant[tmp.x][tmp.y <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">=</span> tmp.d <span style="color:#f92672">+</span> slant[tmp.x][tmp.y <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>];
                    Q.push(queue_node(d_slant[tmp.x][tmp.y <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>], <span style="color:#ae81ff">3</span>, tmp.x, tmp.y <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>));
                    visit_slant[tmp.x][tmp.y <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">=</span> false;
                }
            }
            <span style="color:#66d9ef">if</span> (tmp.y <span style="color:#f92672">&lt;</span> m)
            {
                <span style="color:#66d9ef">if</span> ((d_slant[tmp.x][tmp.y] <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>) <span style="color:#f92672">||</span> (tmp.d <span style="color:#f92672">+</span> slant[tmp.x][tmp.y] <span style="color:#f92672">&lt;</span> d_slant[tmp.x][tmp.y]))
                {
                    d_slant[tmp.x][tmp.y] <span style="color:#f92672">=</span> tmp.d <span style="color:#f92672">+</span> slant[tmp.x][tmp.y];
                    Q.push(queue_node(d_slant[tmp.x][tmp.y], <span style="color:#ae81ff">3</span>, tmp.x, tmp.y));
                    visit_slant[tmp.x][tmp.y] <span style="color:#f92672">=</span> false;
                }
                <span style="color:#66d9ef">if</span> ((d_row[tmp.x <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>][tmp.y] <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>) <span style="color:#f92672">||</span> (tmp.d <span style="color:#f92672">+</span> row[tmp.x <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>][tmp.y] <span style="color:#f92672">&lt;</span> d_row[tmp.x <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>][tmp.y]))
                {
                    d_row[tmp.x <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>][tmp.y] <span style="color:#f92672">=</span> tmp.d <span style="color:#f92672">+</span> row[tmp.x <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>][tmp.y];
                    Q.push(queue_node(d_row[tmp.x <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>][tmp.y], <span style="color:#ae81ff">1</span>, tmp.x <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, tmp.y));
                    visit_row[tmp.x <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>][tmp.y] <span style="color:#f92672">=</span> false;
                }
            }
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (tmp.type <span style="color:#f92672">==</span> <span style="color:#ae81ff">3</span>)
        {
            <span style="color:#66d9ef">if</span> (visit_slant[tmp.x][tmp.y])
            {
                <span style="color:#66d9ef">continue</span>;
            }
            visit_slant[tmp.x][tmp.y] <span style="color:#f92672">=</span> true;
            <span style="color:#66d9ef">if</span> ((d_row[tmp.x][tmp.y] <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>) <span style="color:#f92672">||</span> (tmp.d <span style="color:#f92672">+</span> row[tmp.x][tmp.y] <span style="color:#f92672">&lt;</span> d_row[tmp.x][tmp.y]))
            {
                d_row[tmp.x][tmp.y] <span style="color:#f92672">=</span> tmp.d <span style="color:#f92672">+</span> row[tmp.x][tmp.y];
                Q.push(queue_node(d_row[tmp.x][tmp.y], <span style="color:#ae81ff">1</span>, tmp.x, tmp.y));
                visit_row[tmp.x][tmp.y] <span style="color:#f92672">=</span> false;
            }
            <span style="color:#66d9ef">if</span> ((d_row[tmp.x <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>][tmp.y] <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>) <span style="color:#f92672">||</span> (tmp.d <span style="color:#f92672">+</span> row[tmp.x <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>][tmp.y] <span style="color:#f92672">&lt;</span> d_row[tmp.x <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>][tmp.y]))
            {
                d_row[tmp.x <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>][tmp.y] <span style="color:#f92672">=</span> tmp.d <span style="color:#f92672">+</span> row[tmp.x <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>][tmp.y];
                Q.push(queue_node(d_row[tmp.x <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>][tmp.y], <span style="color:#ae81ff">1</span>, tmp.x <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, tmp.y));
                visit_row[tmp.x <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>][tmp.y] <span style="color:#f92672">=</span> false;
            }
            <span style="color:#66d9ef">if</span> ((d_list[tmp.x][tmp.y] <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>) <span style="color:#f92672">||</span> (tmp.d <span style="color:#f92672">+</span> list[tmp.x][tmp.y] <span style="color:#f92672">&lt;</span> d_list[tmp.x][tmp.y]))
            {
                d_list[tmp.x][tmp.y] <span style="color:#f92672">=</span> tmp.d <span style="color:#f92672">+</span> list[tmp.x][tmp.y];
                Q.push(queue_node(d_list[tmp.x][tmp.y], <span style="color:#ae81ff">2</span>, tmp.x, tmp.y));
                visit_list[tmp.x][tmp.y] <span style="color:#f92672">=</span> false;
            }
            <span style="color:#66d9ef">if</span> ((d_list[tmp.x][tmp.y <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>) <span style="color:#f92672">||</span> (tmp.d <span style="color:#f92672">+</span> list[tmp.x][tmp.y <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">&lt;</span> d_row[tmp.x][tmp.y <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>]))
            {
                d_list[tmp.x][tmp.y <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">=</span> tmp.d <span style="color:#f92672">+</span> list[tmp.x][tmp.y <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>];
                Q.push(queue_node(d_list[tmp.x][tmp.y <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>], <span style="color:#ae81ff">2</span>, tmp.x, tmp.y <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>));
                visit_list[tmp.x][tmp.y <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">=</span> false;
            }
        }
    }
    <span style="color:#66d9ef">int</span> min_num <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;</span> m; i<span style="color:#f92672">++</span>)
    {
        min_num <span style="color:#f92672">=</span> min(min_num, d_row[<span style="color:#ae81ff">1</span>][i]);
    }
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;=</span> n; i<span style="color:#f92672">++</span>)
    {
        min_num <span style="color:#f92672">=</span> min(min_num, d_list[i][m]);
    }
    <span style="color:#66d9ef">return</span> min_num;
}

<span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">long</span> <span style="color:#66d9ef">long</span> start_time_ <span style="color:#f92672">=</span> clock();
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;animal.in&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>, stdin);
    freopen(<span style="color:#e6db74">&#34;animal.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    read(n);
    read(m);
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;=</span> n; i<span style="color:#f92672">++</span>)
    {
        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> j <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; j <span style="color:#f92672">&lt;</span> m; j<span style="color:#f92672">++</span>)
        {
            read(row[i][j]);
        }
    }
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;</span> n; i<span style="color:#f92672">++</span>)
    {
        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> j <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; j <span style="color:#f92672">&lt;=</span> m; j<span style="color:#f92672">++</span>)
        {
            read(list[i][j]);
        }
    }
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;</span> n; i<span style="color:#f92672">++</span>)
    {
        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> j <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; j <span style="color:#f92672">&lt;</span> m; j<span style="color:#f92672">++</span>)
        {
            read(slant[i][j]);
        }
    }
    printf(<span style="color:#e6db74">&#34;%d&#34;</span>, dijkstra());
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    printf(<span style="color:#e6db74">&#34;nrun time: %lld msn&#34;</span>, clock() <span style="color:#f92672">-</span> start_time_);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    fclose(stdin);
    fclose(stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
}
</code></pre></div>]]></content></item><item><title>[BZOJ1902][ZOJ2112]ZJU2112 Dynamic Rankings（树状数组 + 主席树）</title><link>https://www.sxn.dev/posts/zoj2112/</link><pubDate>Sun, 18 May 2014 20:27:06 +0000</pubDate><guid>https://www.sxn.dev/posts/zoj2112/</guid><description>&lt;p>终于学会了主席树，写了高贵冷艳的带修改区间第K大（虽然二逼平衡树我是用分块水的），关于不带修改的区间第K大参见我的上一篇博客{% post_link poj2104 %}，其实这个跟树状数组维护前缀和基本是一样的，只是修改时树状数组只需修改(log_2n)个节点，而现在需要修改(log_2n)棵线段树，一共(log_2^2n)个节点。这题在八中上妥妥A了，ZOJ被卡内存（内存小，数据规模还大，还有多组数据，改了半天），到现在都没卡过去，真是不开心。&lt;/p></description><content type="html"><![CDATA[<p>终于学会了主席树，写了高贵冷艳的带修改区间第K大（虽然二逼平衡树我是用分块水的），关于不带修改的区间第K大参见我的上一篇博客{% post_link poj2104 %}，其实这个跟树状数组维护前缀和基本是一样的，只是修改时树状数组只需修改(log_2n)个节点，而现在需要修改(log_2n)棵线段树，一共(log_2^2n)个节点。这题在八中上妥妥A了，ZOJ被卡内存（内存小，数据规模还大，还有多组数据，改了半天），到现在都没卡过去，真是不开心。</p>
<p>八中：</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#75715e">//ZJU 2112.cpp
</span><span style="color:#75715e"></span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;algorithm&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;iostream&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstring&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdlib&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdio&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;string&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;queue&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;stack&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cmath&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;set&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;map&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span>
<span style="color:#75715e">//#define LOCAL
</span><span style="color:#75715e">//#define READ_FILE
</span><span style="color:#75715e"></span><span style="color:#75715e">#define READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define VISUAL_STUDIO
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXN <span style="color:#f92672">=</span> <span style="color:#ae81ff">10010</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXTMP <span style="color:#f92672">=</span> <span style="color:#ae81ff">100</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXTREE <span style="color:#f92672">=</span> <span style="color:#ae81ff">600000</span>;

<span style="color:#75715e">#ifdef LOCAL
</span><span style="color:#75715e">#define LOCAL_TIME
</span><span style="color:#75715e">#define LOCAL_DEBUG
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define STD_DEBUG
</span><span style="color:#75715e">//#define LOCAL_SIMP
</span><span style="color:#75715e"></span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef VISUAL_STUDIO
</span><span style="color:#75715e">#pragma warning(disable: 4996)
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;ctime&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#66d9ef">char</span> fread_char;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">fread_init</span>()
{
    fread_char <span style="color:#f92672">=</span> getchar();
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">get_int</span>()
{
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">while</span> ((fread_char <span style="color:#f92672">&lt;</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">||</span> (fread_char <span style="color:#f92672">&gt;</span> <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        fread_char <span style="color:#f92672">=</span> getchar();
    }
    <span style="color:#66d9ef">while</span> ((fread_char <span style="color:#f92672">&gt;=</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (fread_char <span style="color:#f92672">&lt;=</span> <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        ret <span style="color:#f92672">=</span> ret <span style="color:#f92672">*</span> <span style="color:#ae81ff">10</span> <span style="color:#f92672">+</span> fread_char <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;0&#39;</span>;
        fread_char <span style="color:#f92672">=</span> getchar();
    }
    <span style="color:#66d9ef">return</span> ret;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">char</span> <span style="color:#a6e22e">get_char</span>()
{
    <span style="color:#66d9ef">while</span> ((fread_char <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39; &#39;</span>) <span style="color:#f92672">||</span> (fread_char <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;n&#39;</span>))
    {
        fread_char <span style="color:#f92672">=</span> getchar();
    }
    <span style="color:#66d9ef">char</span> ret <span style="color:#f92672">=</span> fread_char;
    fread_char <span style="color:#f92672">=</span> getchar();
    <span style="color:#66d9ef">return</span> ret;
}
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">read</span>(<span style="color:#66d9ef">int</span> <span style="color:#f92672">&amp;</span>a)
{
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>    a <span style="color:#f92672">=</span> get_int();
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>    scanf(<span style="color:#e6db74">&#34;%d&#34;</span>, <span style="color:#f92672">&amp;</span>a);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">read</span>(<span style="color:#66d9ef">char</span> <span style="color:#f92672">&amp;</span>a)
{
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>    a <span style="color:#f92672">=</span> get_char();
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>    scanf(<span style="color:#e6db74">&#34;%c&#34;</span>, <span style="color:#f92672">&amp;</span>a);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">discre_node</span>
{
    <span style="color:#66d9ef">int</span> val, id;
    <span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">bool</span> <span style="color:#66d9ef">operator</span> <span style="color:#f92672">&lt;</span> (<span style="color:#66d9ef">const</span> discre_node <span style="color:#f92672">&amp;</span>b) <span style="color:#66d9ef">const</span>
    {
        <span style="color:#66d9ef">return</span> val <span style="color:#f92672">&lt;</span> b.val;
    }
};

<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">tree_node</span>
{
    <span style="color:#66d9ef">int</span> tot;
    tree_node <span style="color:#f92672">*</span>l_child, <span style="color:#f92672">*</span>r_child;
    <span style="color:#66d9ef">inline</span> tree_node <span style="color:#f92672">*</span><span style="color:#a6e22e">init</span>()
    {
        l_child <span style="color:#f92672">=</span> r_child <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
        <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">this</span>;
    }
};

tree_node recover_tree_node[MAXTREE];
tree_node <span style="color:#f92672">*</span>stack_recover_tree_node[MAXTREE];
<span style="color:#66d9ef">int</span> top_stack_recover_tree_node <span style="color:#f92672">=</span> MAXTREE;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">init_recover_tree_node</span>()
{
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> MAXTREE; i<span style="color:#f92672">++</span>)
    {
        stack_recover_tree_node[i] <span style="color:#f92672">=</span> recover_tree_node <span style="color:#f92672">+</span> i;
    }
}

<span style="color:#66d9ef">inline</span> tree_node <span style="color:#f92672">*</span><span style="color:#a6e22e">new_node</span>()
{
    <span style="color:#66d9ef">return</span> stack_recover_tree_node[<span style="color:#f92672">--</span>top_stack_recover_tree_node]<span style="color:#f92672">-&gt;</span>init();
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">delete_node</span>(tree_node <span style="color:#f92672">*</span>del_node)
{
    stack_recover_tree_node[top_stack_recover_tree_node<span style="color:#f92672">++</span>] <span style="color:#f92672">=</span> del_node;
}

<span style="color:#66d9ef">int</span> n, m;
discre_node discre_tmp[<span style="color:#ae81ff">2</span> <span style="color:#f92672">*</span> MAXN];
<span style="color:#66d9ef">int</span> tot_discre;
<span style="color:#66d9ef">int</span> discre_to_num[<span style="color:#ae81ff">2</span> <span style="color:#f92672">*</span> MAXN];
<span style="color:#66d9ef">int</span> max_discre;
<span style="color:#66d9ef">char</span> op_string;
<span style="color:#66d9ef">int</span> discre[MAXN];
<span style="color:#66d9ef">int</span> op[MAXN], op_i[MAXN], op_j[MAXN], op_k[MAXN];
tree_node <span style="color:#f92672">*</span>interval[MAXN];

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">tree_insert</span>(<span style="color:#66d9ef">int</span> root, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
    tree_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> interval[root];
    tree_node <span style="color:#f92672">**</span>last_tmp <span style="color:#f92672">=</span> interval <span style="color:#f92672">+</span> root;
    <span style="color:#66d9ef">int</span> l <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>, r <span style="color:#f92672">=</span> max_discre, mid;
    <span style="color:#66d9ef">while</span> (l <span style="color:#f92672">&lt;</span> r)
    {
        <span style="color:#66d9ef">if</span> (tmp <span style="color:#f92672">==</span> NULL)
        {
            <span style="color:#f92672">*</span>last_tmp <span style="color:#f92672">=</span> tmp <span style="color:#f92672">=</span> new_node();
            tmp<span style="color:#f92672">-&gt;</span>tot <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
        }
        <span style="color:#66d9ef">else</span>
        {
            tmp<span style="color:#f92672">-&gt;</span>tot<span style="color:#f92672">++</span>;
        }
        mid <span style="color:#f92672">=</span> (l <span style="color:#f92672">+</span> r) <span style="color:#f92672">&gt;&gt;</span> <span style="color:#ae81ff">1</span>;
        <span style="color:#66d9ef">if</span> (val <span style="color:#f92672">&lt;=</span> mid)
        {
            last_tmp <span style="color:#f92672">=</span> <span style="color:#f92672">&amp;</span>tmp<span style="color:#f92672">-&gt;</span>l_child;
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>l_child;
            r <span style="color:#f92672">=</span> mid;
        }
        <span style="color:#66d9ef">else</span>
        {
            last_tmp <span style="color:#f92672">=</span> <span style="color:#f92672">&amp;</span>tmp<span style="color:#f92672">-&gt;</span>r_child;
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>r_child;
            l <span style="color:#f92672">=</span> mid <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
        }
    }
    <span style="color:#66d9ef">if</span> (tmp <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#f92672">*</span>last_tmp <span style="color:#f92672">=</span> tmp <span style="color:#f92672">=</span> new_node();
        tmp<span style="color:#f92672">-&gt;</span>tot <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
    }
    <span style="color:#66d9ef">else</span>
    {
        tmp<span style="color:#f92672">-&gt;</span>tot<span style="color:#f92672">++</span>;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">tree_delete</span>(<span style="color:#66d9ef">int</span> root, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
    tree_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> interval[root];
    <span style="color:#66d9ef">if</span> (tmp <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span>;
    }
    tree_node <span style="color:#f92672">**</span>last_tmp <span style="color:#f92672">=</span> interval <span style="color:#f92672">+</span> root;
    <span style="color:#66d9ef">int</span> l <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>, r <span style="color:#f92672">=</span> max_discre, mid;
    <span style="color:#66d9ef">while</span> (l <span style="color:#f92672">&lt;</span> r)
    {
        tmp<span style="color:#f92672">-&gt;</span>tot<span style="color:#f92672">--</span>;
        <span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>tot <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>)
        {
            delete_node(tmp);
            <span style="color:#f92672">*</span>last_tmp <span style="color:#f92672">=</span> NULL;
        }
        mid <span style="color:#f92672">=</span> (l <span style="color:#f92672">+</span> r) <span style="color:#f92672">&gt;&gt;</span> <span style="color:#ae81ff">1</span>;
        <span style="color:#66d9ef">if</span> (val <span style="color:#f92672">&lt;=</span> mid)
        {
            last_tmp <span style="color:#f92672">=</span> <span style="color:#f92672">&amp;</span>tmp<span style="color:#f92672">-&gt;</span>l_child;
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>l_child;
            r <span style="color:#f92672">=</span> mid;
        }
        <span style="color:#66d9ef">else</span>
        {
            last_tmp <span style="color:#f92672">=</span> <span style="color:#f92672">&amp;</span>tmp<span style="color:#f92672">-&gt;</span>r_child;
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>r_child;
            l <span style="color:#f92672">=</span> mid <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
        } <span style="color:#75715e">//我知道这样写不好。。但是不管了
</span><span style="color:#75715e"></span>    }
    tmp<span style="color:#f92672">-&gt;</span>tot<span style="color:#f92672">--</span>;
    <span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>tot <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>)
    {
        delete_node(tmp);
        <span style="color:#f92672">*</span>last_tmp <span style="color:#f92672">=</span> NULL;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">tree_left_size</span>(tree_node <span style="color:#f92672">*</span>query_node)
{
    <span style="color:#66d9ef">if</span> (query_node <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
    }
    <span style="color:#66d9ef">if</span> (query_node<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
    }
    <span style="color:#66d9ef">return</span> query_node<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>tot;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">lowerbit</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> x)
{
    <span style="color:#66d9ef">return</span> x <span style="color:#f92672">&amp;</span> (<span style="color:#f92672">-</span>x);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">interval_insert</span>(<span style="color:#66d9ef">int</span> l, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
    <span style="color:#66d9ef">while</span> (l <span style="color:#f92672">&lt;=</span> n)
    {
        tree_insert(l, val);
        l <span style="color:#f92672">+=</span> lowerbit(l);
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">interval_delete</span>(<span style="color:#66d9ef">int</span> l, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
    <span style="color:#66d9ef">while</span> (l <span style="color:#f92672">&lt;=</span> n)
    {
        tree_delete(l, val);
        l <span style="color:#f92672">+=</span> lowerbit(l);
    }
}

tree_node <span style="color:#f92672">*</span>tmp_add[MAXTMP];
<span style="color:#66d9ef">int</span> tot_tmp_add;
tree_node <span style="color:#f92672">*</span>tmp_minus[MAXTMP];
<span style="color:#66d9ef">int</span> tot_tmp_minus;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">interval_query</span>(<span style="color:#66d9ef">int</span> l, <span style="color:#66d9ef">int</span> r, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> k)
{
    tot_tmp_add <span style="color:#f92672">=</span> tot_tmp_minus <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">while</span> (r <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>)
    {
        tmp_add[tot_tmp_add<span style="color:#f92672">++</span>] <span style="color:#f92672">=</span> interval[r];
        r <span style="color:#f92672">-=</span> lowerbit(r);
    }
    l<span style="color:#f92672">--</span>;
    <span style="color:#66d9ef">while</span> (l <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>)
    {
        tmp_minus[tot_tmp_minus<span style="color:#f92672">++</span>] <span style="color:#f92672">=</span> interval[l];
        l <span style="color:#f92672">-=</span> lowerbit(l);
    }
    <span style="color:#66d9ef">int</span> binary_l <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>, binary_r <span style="color:#f92672">=</span> max_discre, mid, tot_left;
    <span style="color:#66d9ef">int</span> tot_length <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">while</span> (binary_l <span style="color:#f92672">&lt;</span> binary_r)
    {
        mid <span style="color:#f92672">=</span> (binary_l <span style="color:#f92672">+</span> binary_r) <span style="color:#f92672">&gt;&gt;</span> <span style="color:#ae81ff">1</span>;
        tot_left <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> tot_tmp_add; i<span style="color:#f92672">++</span>)
        {
            tot_left <span style="color:#f92672">+=</span> tree_left_size(tmp_add[i]);
        }
        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> tot_tmp_minus; i<span style="color:#f92672">++</span>)
        {
            tot_left <span style="color:#f92672">-=</span> tree_left_size(tmp_minus[i]);
        }
        <span style="color:#66d9ef">if</span> (tot_length <span style="color:#f92672">+</span> tot_left <span style="color:#f92672">&gt;=</span> k)
        {
            <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> tot_tmp_minus; i<span style="color:#f92672">++</span>)
            {
                <span style="color:#66d9ef">if</span> (tmp_minus[i] <span style="color:#f92672">!=</span> NULL)
                {
                    tmp_minus[i] <span style="color:#f92672">=</span> tmp_minus[i]<span style="color:#f92672">-&gt;</span>l_child;
                }
            }
            <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> tot_tmp_add; i<span style="color:#f92672">++</span>)
            {
                <span style="color:#66d9ef">if</span> (tmp_add[i] <span style="color:#f92672">!=</span> NULL)
                {
                    tmp_add[i] <span style="color:#f92672">=</span> tmp_add[i]<span style="color:#f92672">-&gt;</span>l_child;
                }
            }
            binary_r <span style="color:#f92672">=</span> mid;
        }
        <span style="color:#66d9ef">else</span>
        {
            <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> tot_tmp_minus; i<span style="color:#f92672">++</span>)
            {
                <span style="color:#66d9ef">if</span> (tmp_minus[i] <span style="color:#f92672">!=</span> NULL)
                {
                    tmp_minus[i] <span style="color:#f92672">=</span> tmp_minus[i]<span style="color:#f92672">-&gt;</span>r_child;
                }
            }
            <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> tot_tmp_add; i<span style="color:#f92672">++</span>)
            {
                <span style="color:#66d9ef">if</span> (tmp_add[i] <span style="color:#f92672">!=</span> NULL)
                {
                    tmp_add[i] <span style="color:#f92672">=</span> tmp_add[i]<span style="color:#f92672">-&gt;</span>r_child;
                }
            }
            binary_l <span style="color:#f92672">=</span> mid <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
            tot_length <span style="color:#f92672">+=</span> tot_left;
        }
    }
    <span style="color:#66d9ef">return</span> binary_l;
}

<span style="color:#75715e">#ifndef LOCAL_SIMP
</span><span style="color:#75715e"></span><span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">long</span> <span style="color:#66d9ef">long</span> start_time_ <span style="color:#f92672">=</span> clock();
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;1901.in&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>, stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;1901.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>    fread_init();
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    init_recover_tree_node();
    read(n);
    read(m);
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> n; i<span style="color:#f92672">++</span>)
    {
        read(discre_tmp[i].val);
        discre_tmp[i].id <span style="color:#f92672">=</span> i;
    }
    tot_discre <span style="color:#f92672">=</span> n;
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> m; i<span style="color:#f92672">++</span>)
    {
        read(op_string);
        <span style="color:#66d9ef">if</span> (op_string <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;Q&#39;</span>)
        {
            op[i] <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
            read(op_i[i]);
            read(op_j[i]);
            read(op_k[i]);
        }
        <span style="color:#66d9ef">else</span>
        {
            op[i] <span style="color:#f92672">=</span> <span style="color:#ae81ff">2</span>;
            read(op_i[i]);
            read(discre_tmp[tot_discre].val);
            discre_tmp[tot_discre<span style="color:#f92672">++</span>].id <span style="color:#f92672">=</span> n <span style="color:#f92672">+</span> i;
        }
    }
    std<span style="color:#f92672">::</span>sort(discre_tmp, discre_tmp <span style="color:#f92672">+</span> tot_discre);
    max_discre <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> tot_discre; i<span style="color:#f92672">++</span>)
    {
        <span style="color:#66d9ef">if</span> ((i <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>) <span style="color:#f92672">||</span> (discre_tmp[i <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">&lt;</span> discre_tmp[i]))
        {
            discre_to_num[<span style="color:#f92672">++</span>max_discre] <span style="color:#f92672">=</span> discre_tmp[i].val;
        }
        <span style="color:#66d9ef">if</span> (discre_tmp[i].id <span style="color:#f92672">&lt;</span> n)
        {
            discre[discre_tmp[i].id] <span style="color:#f92672">=</span> max_discre;
        }
        <span style="color:#66d9ef">else</span>
        {
            op_k[discre_tmp[i].id <span style="color:#f92672">-</span> n] <span style="color:#f92672">=</span> max_discre;
        }
    }
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> n; i<span style="color:#f92672">++</span>)
    {
        interval_insert(i <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, discre[i]);
    }
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> m; i<span style="color:#f92672">++</span>)
    {
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>        <span style="color:#66d9ef">if</span> (i <span style="color:#f92672">==</span> <span style="color:#ae81ff">6</span>)
        {
            printf(<span style="color:#e6db74">&#34;&#34;</span>);
        }
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>        <span style="color:#66d9ef">if</span> (op[i] <span style="color:#f92672">==</span> <span style="color:#ae81ff">1</span>)
        {
            printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, discre_to_num[interval_query(op_i[i], op_j[i], op_k[i])]);
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (op[i] <span style="color:#f92672">==</span> <span style="color:#ae81ff">2</span>)
        {
            interval_delete(op_i[i], discre[op_i[i] <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>]);
            interval_insert(op_i[i], op_k[i]);
            discre[op_i[i] <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">=</span> op_k[i];
        }
    }
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    printf(<span style="color:#e6db74">&#34;run time: %lld msn&#34;</span>, clock() <span style="color:#f92672">-</span> start_time_);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    fclose(stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>    fclose(stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
}
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span><span style="color:#66d9ef">int</span> a[MAXN];
<span style="color:#66d9ef">int</span> sort_tmp[MAXN];
<span style="color:#75715e">//int op[MAXN], op_i[MAXN], op_j[MAXN], op_k[MAXN];
</span><span style="color:#75715e"></span><span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
    <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> N <span style="color:#f92672">=</span> <span style="color:#ae81ff">5</span>;
    <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> M <span style="color:#f92672">=</span> <span style="color:#ae81ff">10</span>;
    <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> RAND_BASE <span style="color:#f92672">=</span> <span style="color:#ae81ff">234</span>;
    freopen(<span style="color:#e6db74">&#34;1901.in&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
    srand(RAND_BASE);
    printf(<span style="color:#e6db74">&#34;%d %dn&#34;</span>, N, M);
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> N; i<span style="color:#f92672">++</span>)
    {
        printf(<span style="color:#e6db74">&#34;%d &#34;</span>, a[i] <span style="color:#f92672">=</span> rand());
    }
    printf(<span style="color:#e6db74">&#34;n&#34;</span>);
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> M; i<span style="color:#f92672">++</span>)
    {
        op[i] <span style="color:#f92672">=</span> rand() <span style="color:#f92672">%</span> <span style="color:#ae81ff">2</span>;
        <span style="color:#66d9ef">if</span> (op[i] <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>)
        {
            printf(<span style="color:#e6db74">&#34;Q &#34;</span>);
            op_i[i] <span style="color:#f92672">=</span> rand() <span style="color:#f92672">%</span> N <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
            op_j[i] <span style="color:#f92672">=</span> op_i[i] <span style="color:#f92672">+</span> rand() <span style="color:#f92672">%</span> (N <span style="color:#f92672">-</span> op_i[i] <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>);
            op_k[i] <span style="color:#f92672">=</span> rand() <span style="color:#f92672">%</span> (op_j[i] <span style="color:#f92672">-</span> op_i[i] <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
            printf(<span style="color:#e6db74">&#34;%d %d %dn&#34;</span>, op_i[i], op_j[i], op_k[i]);
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (op[i] <span style="color:#f92672">==</span> <span style="color:#ae81ff">1</span>)
        {
            printf(<span style="color:#e6db74">&#34;C &#34;</span>);
            op_i[i] <span style="color:#f92672">=</span> rand() <span style="color:#f92672">%</span> N <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
            op_k[i] <span style="color:#f92672">=</span> rand();
            printf(<span style="color:#e6db74">&#34;%d %dn&#34;</span>, op_i[i], op_k[i]);
        }
    }
    fclose(stdout);
    freopen(<span style="color:#e6db74">&#34;1901std.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> M; i<span style="color:#f92672">++</span>)
    {
        <span style="color:#66d9ef">if</span> (op[i] <span style="color:#f92672">==</span> <span style="color:#ae81ff">1</span>)
        {
            a[op_i[i] <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">=</span> op_k[i];
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (op[i] <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>)
        {
            memcpy(sort_tmp, a <span style="color:#f92672">+</span> op_i[i] <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>, (op_j[i] <span style="color:#f92672">-</span> op_i[i] <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>) <span style="color:#f92672">*</span> <span style="color:#66d9ef">sizeof</span>(<span style="color:#66d9ef">int</span>));
            std<span style="color:#f92672">::</span>sort(sort_tmp, sort_tmp <span style="color:#f92672">+</span> op_j[i] <span style="color:#f92672">-</span> op_i[i] <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>);
            printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, sort_tmp[op_k[i] <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>]);
        }
    }
    fclose(stdout);
}
<span style="color:#75715e">#endif
</span></code></pre></div><p>POJ版（MLE）：</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#75715e">//ZJU 2112.cpp
</span><span style="color:#75715e"></span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;algorithm&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;iostream&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstring&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdlib&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdio&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;string&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;queue&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;stack&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cmath&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;set&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;map&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span>
<span style="color:#75715e">//#define LOCAL
</span><span style="color:#75715e">//#define READ_FILE
</span><span style="color:#75715e"></span><span style="color:#75715e">#define READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define VISUAL_STUDIO
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXN <span style="color:#f92672">=</span> <span style="color:#ae81ff">50010</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXM <span style="color:#f92672">=</span> <span style="color:#ae81ff">10000</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXTMP <span style="color:#f92672">=</span> <span style="color:#ae81ff">100</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXTREE <span style="color:#f92672">=</span> <span style="color:#ae81ff">3500000</span>;

<span style="color:#75715e">#ifdef LOCAL
</span><span style="color:#75715e">#define LOCAL_TIME
</span><span style="color:#75715e">#define LOCAL_DEBUG
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define STD_DEBUG
</span><span style="color:#75715e">//#define LOCAL_SIMP
</span><span style="color:#75715e"></span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef VISUAL_STUDIO
</span><span style="color:#75715e">#pragma warning(disable: 4996)
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;ctime&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#66d9ef">char</span> fread_char;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">fread_init</span>()
{
	fread_char <span style="color:#f92672">=</span> getchar();
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">get_int</span>()
{
	<span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
	<span style="color:#66d9ef">while</span> ((fread_char <span style="color:#f92672">&lt;</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">||</span> (fread_char <span style="color:#f92672">&gt;</span> <span style="color:#e6db74">&#39;9&#39;</span>))
	{
		fread_char <span style="color:#f92672">=</span> getchar();
	}
	<span style="color:#66d9ef">while</span> ((fread_char <span style="color:#f92672">&gt;=</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (fread_char <span style="color:#f92672">&lt;=</span> <span style="color:#e6db74">&#39;9&#39;</span>))
	{
		ret <span style="color:#f92672">=</span> ret <span style="color:#f92672">*</span> <span style="color:#ae81ff">10</span> <span style="color:#f92672">+</span> fread_char <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;0&#39;</span>;
		fread_char <span style="color:#f92672">=</span> getchar();
	}
	<span style="color:#66d9ef">return</span> ret;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">char</span> <span style="color:#a6e22e">get_char</span>()
{
	<span style="color:#66d9ef">while</span> ((fread_char <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39; &#39;</span>) <span style="color:#f92672">||</span> (fread_char <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;n&#39;</span>))
	{
		fread_char <span style="color:#f92672">=</span> getchar();
	}
	<span style="color:#66d9ef">char</span> ret <span style="color:#f92672">=</span> fread_char;
	fread_char <span style="color:#f92672">=</span> getchar();
	<span style="color:#66d9ef">return</span> ret;
}
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">read</span>(<span style="color:#66d9ef">int</span> <span style="color:#f92672">&amp;</span>a)
{
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>	a <span style="color:#f92672">=</span> get_int();
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>	scanf(<span style="color:#e6db74">&#34;%d&#34;</span>, <span style="color:#f92672">&amp;</span>a);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">read</span>(<span style="color:#66d9ef">char</span> <span style="color:#f92672">&amp;</span>a)
{
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>	a <span style="color:#f92672">=</span> get_char();
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>	scanf(<span style="color:#e6db74">&#34;%c&#34;</span>, <span style="color:#f92672">&amp;</span>a);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">discre_node</span>
{
	<span style="color:#66d9ef">int</span> val, id;
	<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">bool</span> <span style="color:#66d9ef">operator</span> <span style="color:#f92672">&lt;</span> (<span style="color:#66d9ef">const</span> discre_node <span style="color:#f92672">&amp;</span>b) <span style="color:#66d9ef">const</span>
	{
		<span style="color:#66d9ef">return</span> val <span style="color:#f92672">&lt;</span> b.val;
	}
};

<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">tree_node</span>
{
	<span style="color:#66d9ef">int</span> tot;
	tree_node <span style="color:#f92672">*</span>l_child, <span style="color:#f92672">*</span>r_child;
	<span style="color:#66d9ef">inline</span> tree_node <span style="color:#f92672">*</span><span style="color:#a6e22e">init</span>()
	{
		l_child <span style="color:#f92672">=</span> r_child <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
		<span style="color:#66d9ef">return</span> <span style="color:#66d9ef">this</span>;
	}
};

tree_node recover_tree_node[MAXTREE];
tree_node <span style="color:#f92672">*</span>stack_recover_tree_node[MAXTREE];
<span style="color:#66d9ef">int</span> top_stack_recover_tree_node <span style="color:#f92672">=</span> MAXTREE;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">init_recover_tree_node</span>()
{
	<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> MAXTREE; i<span style="color:#f92672">++</span>)
	{
		stack_recover_tree_node[i] <span style="color:#f92672">=</span> recover_tree_node <span style="color:#f92672">+</span> i;
	}
}

<span style="color:#66d9ef">inline</span> tree_node <span style="color:#f92672">*</span><span style="color:#a6e22e">new_node</span>()
{
	<span style="color:#66d9ef">return</span> stack_recover_tree_node[<span style="color:#f92672">--</span>top_stack_recover_tree_node]<span style="color:#f92672">-&gt;</span>init();
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">delete_node</span>(tree_node <span style="color:#f92672">*</span>del_node)
{
	stack_recover_tree_node[top_stack_recover_tree_node<span style="color:#f92672">++</span>] <span style="color:#f92672">=</span> del_node;
}

<span style="color:#66d9ef">int</span> n, m;
discre_node discre_tmp[MAXN <span style="color:#f92672">+</span> MAXM];
<span style="color:#66d9ef">int</span> tot_discre;
<span style="color:#66d9ef">int</span> discre_to_num[MAXN <span style="color:#f92672">+</span> MAXM];
<span style="color:#66d9ef">int</span> max_discre;
<span style="color:#66d9ef">char</span> op_string;
<span style="color:#66d9ef">int</span> discre[MAXN];
<span style="color:#66d9ef">int</span> cases;
<span style="color:#66d9ef">int</span> op[MAXN], op_i[MAXM], op_j[MAXM], op_k[MAXM];
tree_node <span style="color:#f92672">*</span>interval[MAXN];

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">tree_insert</span>(<span style="color:#66d9ef">int</span> root, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
	tree_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> interval[root];
	tree_node <span style="color:#f92672">**</span>last_tmp <span style="color:#f92672">=</span> interval <span style="color:#f92672">+</span> root;
	<span style="color:#66d9ef">int</span> l <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>, r <span style="color:#f92672">=</span> max_discre, mid;
	<span style="color:#66d9ef">while</span> (l <span style="color:#f92672">&lt;</span> r)
	{
		<span style="color:#66d9ef">if</span> (tmp <span style="color:#f92672">==</span> NULL)
		{
			<span style="color:#f92672">*</span>last_tmp <span style="color:#f92672">=</span> tmp <span style="color:#f92672">=</span> new_node();
			tmp<span style="color:#f92672">-&gt;</span>tot <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
		}
		<span style="color:#66d9ef">else</span>
		{
			tmp<span style="color:#f92672">-&gt;</span>tot<span style="color:#f92672">++</span>;
		}
		mid <span style="color:#f92672">=</span> (l <span style="color:#f92672">+</span> r) <span style="color:#f92672">&gt;&gt;</span> <span style="color:#ae81ff">1</span>;
		<span style="color:#66d9ef">if</span> (val <span style="color:#f92672">&lt;=</span> mid)
		{
			last_tmp <span style="color:#f92672">=</span> <span style="color:#f92672">&amp;</span>tmp<span style="color:#f92672">-&gt;</span>l_child;
			tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>l_child;
			r <span style="color:#f92672">=</span> mid;
		}
		<span style="color:#66d9ef">else</span>
		{
			last_tmp <span style="color:#f92672">=</span> <span style="color:#f92672">&amp;</span>tmp<span style="color:#f92672">-&gt;</span>r_child;
			tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>r_child;
			l <span style="color:#f92672">=</span> mid <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
		}
	}
	<span style="color:#66d9ef">if</span> (tmp <span style="color:#f92672">==</span> NULL)
	{
		<span style="color:#f92672">*</span>last_tmp <span style="color:#f92672">=</span> tmp <span style="color:#f92672">=</span> new_node();
		tmp<span style="color:#f92672">-&gt;</span>tot <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
	}
	<span style="color:#66d9ef">else</span>
	{
		tmp<span style="color:#f92672">-&gt;</span>tot<span style="color:#f92672">++</span>;
	}
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">tree_delete</span>(<span style="color:#66d9ef">int</span> root, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
	tree_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> interval[root];
	<span style="color:#66d9ef">if</span> (tmp <span style="color:#f92672">==</span> NULL)
	{
		<span style="color:#66d9ef">return</span>;
	}
	tree_node <span style="color:#f92672">**</span>last_tmp <span style="color:#f92672">=</span> interval <span style="color:#f92672">+</span> root;
	<span style="color:#66d9ef">int</span> l <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>, r <span style="color:#f92672">=</span> max_discre, mid;
	<span style="color:#66d9ef">while</span> (l <span style="color:#f92672">&lt;</span> r)
	{
		tmp<span style="color:#f92672">-&gt;</span>tot<span style="color:#f92672">--</span>;
		<span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>tot <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>)
		{
			delete_node(tmp);
			<span style="color:#f92672">*</span>last_tmp <span style="color:#f92672">=</span> NULL;
		}
		mid <span style="color:#f92672">=</span> (l <span style="color:#f92672">+</span> r) <span style="color:#f92672">&gt;&gt;</span> <span style="color:#ae81ff">1</span>;
		<span style="color:#66d9ef">if</span> (val <span style="color:#f92672">&lt;=</span> mid)
		{
			last_tmp <span style="color:#f92672">=</span> <span style="color:#f92672">&amp;</span>tmp<span style="color:#f92672">-&gt;</span>l_child;
			tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>l_child;
			r <span style="color:#f92672">=</span> mid;
		}
		<span style="color:#66d9ef">else</span>
		{
			last_tmp <span style="color:#f92672">=</span> <span style="color:#f92672">&amp;</span>tmp<span style="color:#f92672">-&gt;</span>r_child;
			tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>r_child;
			l <span style="color:#f92672">=</span> mid <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
		} <span style="color:#75715e">//我知道这样写不好。。但是不管了
</span><span style="color:#75715e"></span>	}
	<span style="color:#66d9ef">if</span> (tmp <span style="color:#f92672">!=</span> NULL)
	{
		tmp<span style="color:#f92672">-&gt;</span>tot<span style="color:#f92672">--</span>;
		<span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>tot <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>)
		{
			delete_node(tmp);
			<span style="color:#f92672">*</span>last_tmp <span style="color:#f92672">=</span> NULL;
		}
	}
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">tree_left_size</span>(tree_node <span style="color:#f92672">*</span>query_node)
{
	<span style="color:#66d9ef">if</span> (query_node <span style="color:#f92672">==</span> NULL)
	{
		<span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
	}
	<span style="color:#66d9ef">if</span> (query_node<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> NULL)
	{
		<span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
	}
	<span style="color:#66d9ef">return</span> query_node<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>tot;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">lowerbit</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> x)
{
	<span style="color:#66d9ef">return</span> x <span style="color:#f92672">&amp;</span> (<span style="color:#f92672">-</span>x);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">interval_insert</span>(<span style="color:#66d9ef">int</span> l, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
	<span style="color:#66d9ef">while</span> (l <span style="color:#f92672">&lt;=</span> n)
	{
		tree_insert(l, val);
		l <span style="color:#f92672">+=</span> lowerbit(l);
	}
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">interval_delete</span>(<span style="color:#66d9ef">int</span> l, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
	<span style="color:#66d9ef">while</span> (l <span style="color:#f92672">&lt;=</span> n)
	{
		tree_delete(l, val);
		l <span style="color:#f92672">+=</span> lowerbit(l);
	}
}

tree_node <span style="color:#f92672">*</span>tmp_add[MAXTMP];
<span style="color:#66d9ef">int</span> tot_tmp_add;
tree_node <span style="color:#f92672">*</span>tmp_minus[MAXTMP];
<span style="color:#66d9ef">int</span> tot_tmp_minus;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">interval_query</span>(<span style="color:#66d9ef">int</span> l, <span style="color:#66d9ef">int</span> r, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> k)
{
	tot_tmp_add <span style="color:#f92672">=</span> tot_tmp_minus <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
	<span style="color:#66d9ef">while</span> (r <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>)
	{
		tmp_add[tot_tmp_add<span style="color:#f92672">++</span>] <span style="color:#f92672">=</span> interval[r];
		r <span style="color:#f92672">-=</span> lowerbit(r);
	}
	l<span style="color:#f92672">--</span>;
	<span style="color:#66d9ef">while</span> (l <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>)
	{
		tmp_minus[tot_tmp_minus<span style="color:#f92672">++</span>] <span style="color:#f92672">=</span> interval[l];
		l <span style="color:#f92672">-=</span> lowerbit(l);
	}
	<span style="color:#66d9ef">int</span> binary_l <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>, binary_r <span style="color:#f92672">=</span> max_discre, mid, tot_left;
	<span style="color:#66d9ef">int</span> tot_length <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
	<span style="color:#66d9ef">while</span> (binary_l <span style="color:#f92672">&lt;</span> binary_r)
	{
		mid <span style="color:#f92672">=</span> (binary_l <span style="color:#f92672">+</span> binary_r) <span style="color:#f92672">&gt;&gt;</span> <span style="color:#ae81ff">1</span>;
		tot_left <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
		<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> tot_tmp_add; i<span style="color:#f92672">++</span>)
		{
			tot_left <span style="color:#f92672">+=</span> tree_left_size(tmp_add[i]);
		}
		<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> tot_tmp_minus; i<span style="color:#f92672">++</span>)
		{
			tot_left <span style="color:#f92672">-=</span> tree_left_size(tmp_minus[i]);
		}
		<span style="color:#66d9ef">if</span> (tot_length <span style="color:#f92672">+</span> tot_left <span style="color:#f92672">&gt;=</span> k)
		{
			<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> tot_tmp_minus; i<span style="color:#f92672">++</span>)
			{
				<span style="color:#66d9ef">if</span> (tmp_minus[i] <span style="color:#f92672">!=</span> NULL)
				{
					tmp_minus[i] <span style="color:#f92672">=</span> tmp_minus[i]<span style="color:#f92672">-&gt;</span>l_child;
				}
			}
			<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> tot_tmp_add; i<span style="color:#f92672">++</span>)
			{
				<span style="color:#66d9ef">if</span> (tmp_add[i] <span style="color:#f92672">!=</span> NULL)
				{
					tmp_add[i] <span style="color:#f92672">=</span> tmp_add[i]<span style="color:#f92672">-&gt;</span>l_child;
				}
			}
			binary_r <span style="color:#f92672">=</span> mid;
		}
		<span style="color:#66d9ef">else</span>
		{
			<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> tot_tmp_minus; i<span style="color:#f92672">++</span>)
			{
				<span style="color:#66d9ef">if</span> (tmp_minus[i] <span style="color:#f92672">!=</span> NULL)
				{
					tmp_minus[i] <span style="color:#f92672">=</span> tmp_minus[i]<span style="color:#f92672">-&gt;</span>r_child;
				}
			}
			<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> tot_tmp_add; i<span style="color:#f92672">++</span>)
			{
				<span style="color:#66d9ef">if</span> (tmp_add[i] <span style="color:#f92672">!=</span> NULL)
				{
					tmp_add[i] <span style="color:#f92672">=</span> tmp_add[i]<span style="color:#f92672">-&gt;</span>r_child;
				}
			}
			binary_l <span style="color:#f92672">=</span> mid <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
			tot_length <span style="color:#f92672">+=</span> tot_left;
		}
	}
	<span style="color:#66d9ef">return</span> binary_l;
}

<span style="color:#75715e">#ifndef LOCAL_SIMP
</span><span style="color:#75715e"></span><span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>	<span style="color:#66d9ef">long</span> <span style="color:#66d9ef">long</span> start_time_ <span style="color:#f92672">=</span> clock();
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>	freopen(<span style="color:#e6db74">&#34;1901.in&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>, stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>	freopen(<span style="color:#e6db74">&#34;1901.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>	fread_init();
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>	init_recover_tree_node();
	read(cases);
	<span style="color:#66d9ef">while</span> (cases<span style="color:#f92672">--</span>)
	{
		top_stack_recover_tree_node <span style="color:#f92672">=</span> MAXTREE;
		init_recover_tree_node();
		memset(interval, <span style="color:#ae81ff">0</span>, <span style="color:#66d9ef">sizeof</span>(interval));
		read(n);
		read(m);
		<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> n; i<span style="color:#f92672">++</span>)
		{
			read(discre_tmp[i].val);
			discre_tmp[i].id <span style="color:#f92672">=</span> i;
		}
		tot_discre <span style="color:#f92672">=</span> n;
		<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> m; i<span style="color:#f92672">++</span>)
		{
			read(op_string);
			<span style="color:#66d9ef">if</span> (op_string <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;Q&#39;</span>)
			{
				op[i] <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
				read(op_i[i]);
				read(op_j[i]);
				read(op_k[i]);
			}
			<span style="color:#66d9ef">else</span>
			{
				op[i] <span style="color:#f92672">=</span> <span style="color:#ae81ff">2</span>;
				read(op_i[i]);
				read(discre_tmp[tot_discre].val);
				discre_tmp[tot_discre<span style="color:#f92672">++</span>].id <span style="color:#f92672">=</span> n <span style="color:#f92672">+</span> i;
			}
		}
		std<span style="color:#f92672">::</span>sort(discre_tmp, discre_tmp <span style="color:#f92672">+</span> tot_discre);
		max_discre <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
		<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> tot_discre; i<span style="color:#f92672">++</span>)
		{
			<span style="color:#66d9ef">if</span> ((i <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>) <span style="color:#f92672">||</span> (discre_tmp[i <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">&lt;</span> discre_tmp[i]))
			{
				discre_to_num[<span style="color:#f92672">++</span>max_discre] <span style="color:#f92672">=</span> discre_tmp[i].val;
			}
			<span style="color:#66d9ef">if</span> (discre_tmp[i].id <span style="color:#f92672">&lt;</span> n)
			{
				discre[discre_tmp[i].id] <span style="color:#f92672">=</span> max_discre;
			}
			<span style="color:#66d9ef">else</span>
			{
				op_k[discre_tmp[i].id <span style="color:#f92672">-</span> n] <span style="color:#f92672">=</span> max_discre;
			}
		}
		<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> n; i<span style="color:#f92672">++</span>)
		{
			interval_insert(i <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, discre[i]);
		}
		<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> m; i<span style="color:#f92672">++</span>)
		{
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>			<span style="color:#66d9ef">if</span> (i <span style="color:#f92672">==</span> <span style="color:#ae81ff">6</span>)
			{
				printf(<span style="color:#e6db74">&#34;&#34;</span>);
			}
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>			<span style="color:#66d9ef">if</span> (op[i] <span style="color:#f92672">==</span> <span style="color:#ae81ff">1</span>)
			{
				printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, discre_to_num[interval_query(op_i[i], op_j[i], op_k[i])]);
			}
			<span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (op[i] <span style="color:#f92672">==</span> <span style="color:#ae81ff">2</span>)
			{
				interval_delete(op_i[i], discre[op_i[i] <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>]);
				interval_insert(op_i[i], op_k[i]);
				discre[op_i[i] <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">=</span> op_k[i];
			}
		}
	}
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>	printf(<span style="color:#e6db74">&#34;run time: %lld msn&#34;</span>, clock() <span style="color:#f92672">-</span> start_time_);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>	fclose(stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>	fclose(stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>	<span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
}
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span><span style="color:#66d9ef">int</span> a[MAXN];
<span style="color:#66d9ef">int</span> sort_tmp[MAXN];
<span style="color:#75715e">//int op[MAXN], op_i[MAXN], op_j[MAXN], op_k[MAXN];
</span><span style="color:#75715e"></span><span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
	<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> N <span style="color:#f92672">=</span> <span style="color:#ae81ff">50000</span>;
	<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> M <span style="color:#f92672">=</span> <span style="color:#ae81ff">10000</span>;
	<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> BASE <span style="color:#f92672">=</span> <span style="color:#ae81ff">4</span>;
	<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> RAND_BASE <span style="color:#f92672">=</span> <span style="color:#ae81ff">23104</span>;
	freopen(<span style="color:#e6db74">&#34;1901.in&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
	srand(RAND_BASE);
	printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, BASE);
	<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> j <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; j <span style="color:#f92672">&lt;</span> BASE; j<span style="color:#f92672">++</span>)
	{
		printf(<span style="color:#e6db74">&#34;%d %dn&#34;</span>, N, M);
		<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> N; i<span style="color:#f92672">++</span>)
		{
			printf(<span style="color:#e6db74">&#34;%d &#34;</span>, a[i] <span style="color:#f92672">=</span> rand());
		}
		printf(<span style="color:#e6db74">&#34;n&#34;</span>);
		<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> M; i<span style="color:#f92672">++</span>)
		{
			op[i] <span style="color:#f92672">=</span> rand() <span style="color:#f92672">%</span> <span style="color:#ae81ff">2</span>;
			<span style="color:#66d9ef">if</span> (op[i] <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>)
			{
				printf(<span style="color:#e6db74">&#34;Q &#34;</span>);
				op_i[i] <span style="color:#f92672">=</span> rand() <span style="color:#f92672">%</span> N <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
				op_j[i] <span style="color:#f92672">=</span> op_i[i] <span style="color:#f92672">+</span> rand() <span style="color:#f92672">%</span> (N <span style="color:#f92672">-</span> op_i[i] <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>);
				op_k[i] <span style="color:#f92672">=</span> rand() <span style="color:#f92672">%</span> (op_j[i] <span style="color:#f92672">-</span> op_i[i] <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
				printf(<span style="color:#e6db74">&#34;%d %d %dn&#34;</span>, op_i[i], op_j[i], op_k[i]);
			}
			<span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (op[i] <span style="color:#f92672">==</span> <span style="color:#ae81ff">1</span>)
			{
				printf(<span style="color:#e6db74">&#34;C &#34;</span>);
				op_i[i] <span style="color:#f92672">=</span> rand() <span style="color:#f92672">%</span> N <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
				op_k[i] <span style="color:#f92672">=</span> rand();
				printf(<span style="color:#e6db74">&#34;%d %dn&#34;</span>, op_i[i], op_k[i]);
			}
		}
	}
	fclose(stdout);
	<span style="color:#75715e">/*freopen(&#34;1901std.out&#34;, &#34;w&#34;, stdout);
</span><span style="color:#75715e">	for (int i = 0; i &lt; M; i++)
</span><span style="color:#75715e">	{
</span><span style="color:#75715e">		if (op[i] == 1)
</span><span style="color:#75715e">		{
</span><span style="color:#75715e">			a[op_i[i] - 1] = op_k[i];
</span><span style="color:#75715e">		}
</span><span style="color:#75715e">		else if (op[i] == 0)
</span><span style="color:#75715e">		{
</span><span style="color:#75715e">			memcpy(sort_tmp, a + op_i[i] - 1, (op_j[i] - op_i[i] + 1) * sizeof(int));
</span><span style="color:#75715e">			std::sort(sort_tmp, sort_tmp + op_j[i] - op_i[i] + 1);
</span><span style="color:#75715e">			printf(&#34;%dn&#34;, sort_tmp[op_k[i] - 1]);
</span><span style="color:#75715e">		}
</span><span style="color:#75715e">	}
</span><span style="color:#75715e">	fclose(stdout);*/</span>
}
<span style="color:#75715e">#endif
</span></code></pre></div><p>心情好的话再写个分块试试能不能水过。</p>]]></content></item><item><title>[POJ2104]K-th Number（主席树）</title><link>https://www.sxn.dev/posts/poj2104/</link><pubDate>Sun, 18 May 2014 12:47:50 +0000</pubDate><guid>https://www.sxn.dev/posts/poj2104/</guid><description>&lt;p>终于下定决心开始学主席树了，先找了一道不带修改的区间第K大做。关于带修改的区间第K大，参见我的下一篇博客 {% post_link zoj2112 %}&lt;/p>
&lt;p>主席树其实就是一种可持久化的线段树，是函数式编程的一个很经典的应用（另外的话，我就只知道FANHQ_TREAP了）。主要思想是在对线段树的节点进行修改的时候，不改变原节点，而是新开一个节点并链到数中。&lt;/p></description><content type="html"><![CDATA[<p>终于下定决心开始学主席树了，先找了一道不带修改的区间第K大做。关于带修改的区间第K大，参见我的下一篇博客 {% post_link zoj2112 %}</p>
<p>主席树其实就是一种可持久化的线段树，是函数式编程的一个很经典的应用（另外的话，我就只知道FANHQ_TREAP了）。主要思想是在对线段树的节点进行修改的时候，不改变原节点，而是新开一个节点并链到数中。</p>
<p>用主席树对一个长度为n的数列做区间第K大需要建n棵线段树，第i棵线段树维护前i个数的信息。线段树对数列的值二分，一个覆盖[l, r]的节点表示前i个数中值的大小在[l, r]内的数的个数。如数列1,2,3,5,4的第4棵线段树记录1,2,3,5的信息，这棵线段树上覆盖[1, 5]的节点的tot=4，因为所有数的大小都在[1, 5]内，而覆盖[1, 4]的节点的tot=3，因为只有1,2,3在[1, 4]内。</p>
<p>那我们怎么找区间第k大呢？假设我们需要知道区间[l, r]内（这里的l和r表示数的下标，不同于上面表示值）的区间第k大，那我们需要一棵记录[l, r]内数的信息的线段树，我们之前已经建好了数列所有前缀的线段树，稍加思考就可以知道，这样一棵线段树可以由第r棵线段树减去第l - 1棵线段树得到。比如我要得到[3, 5]内数的大小在[1, 5]之间的数的个数，那我们可以通过前5个数中大小在[1, 5]之间的数的个数减去前2个数中大小在[1, 5]之间的数的个数得到。</p>
<p>好像做了那么久都没有用到可持久化啊，这样的空间复杂度和时间复杂度依然在(O(n^2))级别，我还不如写暴力。那怎么办呢？前面我们讲到了函数式编程的方法。首先，由于主席树是根据值做二分，每棵主席树其实长得都一样，而且第i棵主席树和第i - 1棵主席树许多节点也是一样的，要修改的只是长度为(log_2n)的一条链，那我们在生成第i棵主席树的时候就可以用到第i棵主席树上大多数的节点，对于需要修改的只需要新建节点即可。这样的话时间和空间复杂度就降到了(O(nlog_2n))的级别。</p>
<p>再多加考虑的话会发现很多主席数上的节点都记录着0，而且一个节点记录着0意味着它的两棵子树上的所有节点记录的也都是0，那么这些节点就是多余的。所以初始的时候我们只需要一个空节点，在初始化的过程中再往树上增加节点就又可以很大程度上节约内存。</p>
<p>如果对原数列进行离散化可以进一步节约空间和时间，这样做下来，在POJ上这道题我一共开了200W的线段树节点就AC了， 内存40+M，时间1.5S（写得渣求不BS）。下面是代码（最后有一个调试的时候用的暴力，请无视之）。</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#75715e">//POJ 2104.cpp
</span><span style="color:#75715e"></span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;algorithm&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;iostream&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstring&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdlib&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdio&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;string&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cmath&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;queue&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;stack&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;set&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;map&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span>
<span style="color:#75715e">//#define LOCAL
</span><span style="color:#75715e">//#define READ_FILE
</span><span style="color:#75715e"></span><span style="color:#75715e">#define READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define VISUAL_STUDIO
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL
</span><span style="color:#75715e">#define LOCAL_TIME
</span><span style="color:#75715e">#define LOCAL_DEBUG
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define LOCAL_SIMP
</span><span style="color:#75715e"></span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXN <span style="color:#f92672">=</span> <span style="color:#ae81ff">100010</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXTREE <span style="color:#f92672">=</span> <span style="color:#ae81ff">2000000</span>;

<span style="color:#75715e">#ifdef VISUAL_STUDIO
</span><span style="color:#75715e">#pragma warning(disable: 4996)
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;ctime&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#66d9ef">char</span> fread_char;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">fread_init</span>()
{
	fread_char <span style="color:#f92672">=</span> getchar();
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">get_int</span>()
{
	<span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
	<span style="color:#66d9ef">while</span> ((fread_char <span style="color:#f92672">&lt;</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">||</span> (fread_char <span style="color:#f92672">&gt;</span> <span style="color:#e6db74">&#39;9&#39;</span>))
	{
		fread_char <span style="color:#f92672">=</span> getchar();
	}
	<span style="color:#66d9ef">while</span> ((fread_char <span style="color:#f92672">&gt;=</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (fread_char <span style="color:#f92672">&lt;=</span> <span style="color:#e6db74">&#39;9&#39;</span>))
	{
		ret <span style="color:#f92672">=</span> ret <span style="color:#f92672">*</span> <span style="color:#ae81ff">10</span> <span style="color:#f92672">+</span> fread_char <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;0&#39;</span>;
		fread_char <span style="color:#f92672">=</span> getchar();
	}
	<span style="color:#66d9ef">return</span> ret;
}
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">read</span>(<span style="color:#66d9ef">int</span> <span style="color:#f92672">&amp;</span>a)
{
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>	a <span style="color:#f92672">=</span> get_int();
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>	scanf(<span style="color:#e6db74">&#34;%d&#34;</span>, <span style="color:#f92672">&amp;</span>a);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">discre_node</span>
{
	<span style="color:#66d9ef">int</span> val, id;
	<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">bool</span> <span style="color:#66d9ef">operator</span> <span style="color:#f92672">&lt;</span> (<span style="color:#66d9ef">const</span> discre_node <span style="color:#f92672">&amp;</span>b) <span style="color:#66d9ef">const</span>
	{
		<span style="color:#66d9ef">return</span> val <span style="color:#f92672">&lt;</span> b.val;
	}
};

<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">tree_node</span>
{
	<span style="color:#66d9ef">int</span> tot;
	tree_node <span style="color:#f92672">*</span>l_child, <span style="color:#f92672">*</span>r_child;
	<span style="color:#66d9ef">inline</span> tree_node <span style="color:#f92672">*</span><span style="color:#a6e22e">init</span>()
	{
		l_child <span style="color:#f92672">=</span> r_child <span style="color:#f92672">=</span> NULL;
		tot <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
		<span style="color:#66d9ef">return</span> <span style="color:#66d9ef">this</span>;
	}
};

tree_node recover_tree_node[MAXTREE];
tree_node <span style="color:#f92672">*</span>stack_recover_tree_node[MAXTREE];
<span style="color:#66d9ef">int</span> top_stack_recover_treee_node <span style="color:#f92672">=</span> MAXTREE;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">init_recover_tree_node</span>()
{
	<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> MAXTREE; i<span style="color:#f92672">++</span>)
	{
		stack_recover_tree_node[i] <span style="color:#f92672">=</span> recover_tree_node <span style="color:#f92672">+</span> i;
	}
}

<span style="color:#66d9ef">inline</span> tree_node <span style="color:#f92672">*</span><span style="color:#a6e22e">new_node</span>()
{
	<span style="color:#66d9ef">return</span> stack_recover_tree_node[<span style="color:#f92672">--</span>top_stack_recover_treee_node]<span style="color:#f92672">-&gt;</span>init();
}

<span style="color:#66d9ef">int</span> n, m;
discre_node discre_tmp[MAXN];
<span style="color:#66d9ef">int</span> discre_to_num[MAXN];
<span style="color:#66d9ef">int</span> discre[MAXN];
<span style="color:#66d9ef">int</span> max_dis;
<span style="color:#66d9ef">int</span> l, r, k;
tree_node <span style="color:#f92672">*</span>prefix[MAXN];

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">tree_insert</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> i)
{
	prefix[i] <span style="color:#f92672">=</span> new_node();
	tree_node <span style="color:#f92672">*</span>last_root <span style="color:#f92672">=</span> (i <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span> <span style="color:#f92672">?</span> NULL <span style="color:#f92672">:</span> prefix[i <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>]);
	tree_node <span style="color:#f92672">*</span>new_root <span style="color:#f92672">=</span> prefix[i];
	<span style="color:#66d9ef">int</span> l <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>, r <span style="color:#f92672">=</span> max_dis, mid;
	<span style="color:#66d9ef">while</span> (l <span style="color:#f92672">&lt;</span> r)
	{
		mid <span style="color:#f92672">=</span> (l <span style="color:#f92672">+</span> r) <span style="color:#f92672">&gt;&gt;</span> <span style="color:#ae81ff">1</span>;
		<span style="color:#66d9ef">if</span> (discre[i] <span style="color:#f92672">&lt;=</span> mid)
		{
			new_root<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> (last_root <span style="color:#f92672">==</span> NULL <span style="color:#f92672">?</span> NULL <span style="color:#f92672">:</span> last_root<span style="color:#f92672">-&gt;</span>r_child);
			<span style="color:#66d9ef">if</span> (last_root <span style="color:#f92672">!=</span> NULL)
			{
				new_root<span style="color:#f92672">-&gt;</span>tot <span style="color:#f92672">=</span> last_root<span style="color:#f92672">-&gt;</span>tot <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
				last_root <span style="color:#f92672">=</span> last_root<span style="color:#f92672">-&gt;</span>l_child;
			}
			<span style="color:#66d9ef">else</span>
			{
				new_root<span style="color:#f92672">-&gt;</span>tot <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
			}
			new_root<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> new_node();
			new_root <span style="color:#f92672">=</span> new_root<span style="color:#f92672">-&gt;</span>l_child;
			r <span style="color:#f92672">=</span> mid;
		}
		<span style="color:#66d9ef">else</span>
		{
			new_root<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> (last_root <span style="color:#f92672">==</span> NULL <span style="color:#f92672">?</span> NULL <span style="color:#f92672">:</span> last_root<span style="color:#f92672">-&gt;</span>l_child);
			<span style="color:#66d9ef">if</span> (last_root <span style="color:#f92672">!=</span> NULL)
			{
				new_root<span style="color:#f92672">-&gt;</span>tot <span style="color:#f92672">=</span> last_root<span style="color:#f92672">-&gt;</span>tot <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
				last_root <span style="color:#f92672">=</span> last_root<span style="color:#f92672">-&gt;</span>r_child;
			}
			<span style="color:#66d9ef">else</span>
			{
				new_root<span style="color:#f92672">-&gt;</span>tot <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
			}
			new_root<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> new_node();
			new_root <span style="color:#f92672">=</span> new_root<span style="color:#f92672">-&gt;</span>r_child;
			l <span style="color:#f92672">=</span> mid <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
		}
	}
	<span style="color:#66d9ef">if</span> (last_root <span style="color:#f92672">!=</span> NULL)
	{
		new_root<span style="color:#f92672">-&gt;</span>tot <span style="color:#f92672">=</span> last_root<span style="color:#f92672">-&gt;</span>tot <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
	}
	<span style="color:#66d9ef">else</span>
	{
		new_root<span style="color:#f92672">-&gt;</span>tot <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
	}
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">left_size</span>(tree_node <span style="color:#f92672">*</span>query)
{
	<span style="color:#66d9ef">if</span> (query <span style="color:#f92672">==</span> NULL)
	{
		<span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
	}
	<span style="color:#66d9ef">if</span> (query<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> NULL)
	{
		<span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
	}
	<span style="color:#66d9ef">return</span> query<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>tot;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">tree_k_th</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> l, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> r, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> k)
{
	tree_node <span style="color:#f92672">*</span>left_root <span style="color:#f92672">=</span> (l <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span> <span style="color:#f92672">?</span> NULL <span style="color:#f92672">:</span> prefix[l <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>]);
	tree_node <span style="color:#f92672">*</span>right_root <span style="color:#f92672">=</span> prefix[r];
	<span style="color:#66d9ef">int</span> binary_l <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>, binary_r <span style="color:#f92672">=</span> max_dis, mid;
	<span style="color:#66d9ef">int</span> tot_left <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
	<span style="color:#66d9ef">while</span> (binary_l <span style="color:#f92672">&lt;</span> binary_r)
	{
		mid <span style="color:#f92672">=</span> (binary_l <span style="color:#f92672">+</span> binary_r) <span style="color:#f92672">&gt;&gt;</span> <span style="color:#ae81ff">1</span>;
		<span style="color:#66d9ef">if</span> (tot_left <span style="color:#f92672">+</span> left_size(right_root) <span style="color:#f92672">-</span> left_size(left_root) <span style="color:#f92672">&gt;=</span> k)
		{
			right_root <span style="color:#f92672">=</span> right_root<span style="color:#f92672">-&gt;</span>l_child;
			<span style="color:#66d9ef">if</span> (left_root <span style="color:#f92672">!=</span> NULL)
			{
				left_root <span style="color:#f92672">=</span> left_root<span style="color:#f92672">-&gt;</span>l_child;
			}
			binary_r <span style="color:#f92672">=</span> mid;
		}
		<span style="color:#66d9ef">else</span>
		{
			tot_left <span style="color:#f92672">+=</span> left_size(right_root) <span style="color:#f92672">-</span> left_size(left_root);
			right_root <span style="color:#f92672">=</span> right_root<span style="color:#f92672">-&gt;</span>r_child;
			<span style="color:#66d9ef">if</span> (left_root <span style="color:#f92672">!=</span> NULL)
			{
				left_root <span style="color:#f92672">=</span> left_root<span style="color:#f92672">-&gt;</span>r_child;
			}
			binary_l <span style="color:#f92672">=</span> mid <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
		}
	}
	<span style="color:#66d9ef">return</span> binary_l;
}

<span style="color:#75715e">#ifndef LOCAL_SIMP
</span><span style="color:#75715e"></span><span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>	<span style="color:#66d9ef">long</span> <span style="color:#66d9ef">long</span> start_time_ <span style="color:#f92672">=</span> clock();
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>	freopen(<span style="color:#e6db74">&#34;2104.in&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>, stdin);
	freopen(<span style="color:#e6db74">&#34;2104.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>	fread_init();
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>	read(n);
	read(m);
	init_recover_tree_node();
	<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> n; i<span style="color:#f92672">++</span>)
	{
		scanf(<span style="color:#e6db74">&#34;%d&#34;</span>, <span style="color:#f92672">&amp;</span>discre_tmp[i].val);
		discre_tmp[i].id <span style="color:#f92672">=</span> i;
	}
	std<span style="color:#f92672">::</span>sort(discre_tmp, discre_tmp <span style="color:#f92672">+</span> n);
	max_dis <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
	<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> n; i<span style="color:#f92672">++</span>)
	{
		<span style="color:#66d9ef">if</span> ((i <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>) <span style="color:#f92672">||</span> (discre_tmp[i <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">&lt;</span> discre_tmp[i]))
		{
			discre_to_num[<span style="color:#f92672">++</span>max_dis] <span style="color:#f92672">=</span> discre_tmp[i].val;
		}
		discre[discre_tmp[i].id] <span style="color:#f92672">=</span> max_dis;
	}
	<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> n; i<span style="color:#f92672">++</span>)
	{
		tree_insert(i);
	}
	<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> m; i<span style="color:#f92672">++</span>)
	{
		read(l);
		read(r);
		read(k);
		printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, discre_to_num[tree_k_th(l <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>, r <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>, k)]);
	}
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>	printf(<span style="color:#e6db74">&#34;run time: %lld msn&#34;</span>, clock() <span style="color:#f92672">-</span> start_time_);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>	fclose(stdin);
	fclose(stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>	<span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
}
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span><span style="color:#66d9ef">int</span> a[MAXN];
<span style="color:#66d9ef">int</span> sort_tmp[MAXN];

<span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
	<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> N <span style="color:#f92672">=</span> <span style="color:#ae81ff">10</span>;
	<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> M <span style="color:#f92672">=</span> <span style="color:#ae81ff">10</span>;
	<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> RAND_BASE <span style="color:#f92672">=</span> <span style="color:#ae81ff">243</span>;
	freopen(<span style="color:#e6db74">&#34;2104.in&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
	srand(RAND_BASE);
	printf(<span style="color:#e6db74">&#34;%d %dn&#34;</span>, N, M);
	<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> N; i<span style="color:#f92672">++</span>)
	{
		printf(<span style="color:#e6db74">&#34;%d &#34;</span>, rand());
	}
	printf(<span style="color:#e6db74">&#34;n&#34;</span>);
	<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> M; i<span style="color:#f92672">++</span>)
	{
		<span style="color:#66d9ef">int</span> l <span style="color:#f92672">=</span> rand() <span style="color:#f92672">%</span> N <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
		<span style="color:#66d9ef">int</span> r <span style="color:#f92672">=</span> l <span style="color:#f92672">+</span> rand() <span style="color:#f92672">%</span> (N <span style="color:#f92672">-</span> l <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>);
		<span style="color:#66d9ef">int</span> k <span style="color:#f92672">=</span> rand() <span style="color:#f92672">%</span> (r <span style="color:#f92672">-</span> l <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
		printf(<span style="color:#e6db74">&#34;%d %d %dn&#34;</span>, l, r, k);
	}
	fclose(stdout);
	freopen(<span style="color:#e6db74">&#34;2104.in&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>, stdin);
	freopen(<span style="color:#e6db74">&#34;2104std.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
	scanf(<span style="color:#e6db74">&#34;%d %d&#34;</span>, <span style="color:#f92672">&amp;</span>n, <span style="color:#f92672">&amp;</span>m);
	<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> n; i<span style="color:#f92672">++</span>)
	{
		scanf(<span style="color:#e6db74">&#34;%d&#34;</span>, a <span style="color:#f92672">+</span> i);
	}
	<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> m; i<span style="color:#f92672">++</span>)
	{
		scanf(<span style="color:#e6db74">&#34;%d %d %d&#34;</span>, <span style="color:#f92672">&amp;</span>l, <span style="color:#f92672">&amp;</span>r, <span style="color:#f92672">&amp;</span>k);
		memcpy(sort_tmp, a <span style="color:#f92672">+</span> l <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>, (r <span style="color:#f92672">-</span> l <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>) <span style="color:#f92672">*</span> <span style="color:#66d9ef">sizeof</span>(<span style="color:#66d9ef">int</span>));
		std<span style="color:#f92672">::</span>sort(sort_tmp, sort_tmp <span style="color:#f92672">+</span> r <span style="color:#f92672">-</span> l <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>);
		printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, sort_tmp[k <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>]);
	}
	fclose(stdin);
	fclose(stdout);
	<span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
}
<span style="color:#75715e">#endif
</span></code></pre></div>]]></content></item><item><title>[BZOJ1012][JSOI2008]最大数（树状数组）</title><link>https://www.sxn.dev/posts/jsoi2008-maxnumber/</link><pubDate>Sun, 18 May 2014 09:11:29 +0000</pubDate><guid>https://www.sxn.dev/posts/jsoi2008-maxnumber/</guid><description>&lt;p>树状数组水了一题感觉不熟练就又水了一题。这题主要就是要把整个数列倒过来插，这样就可以把求后L项的最大数转化为求数列前L项的最大数。在树状数组中，维护一个数列大小size，每次插入就插入到第m - size的位置上，每次查询就查询前m - size + l项的最大值（前导零对答案不影响）。&lt;/p></description><content type="html"><![CDATA[<p>树状数组水了一题感觉不熟练就又水了一题。这题主要就是要把整个数列倒过来插，这样就可以把求后L项的最大数转化为求数列前L项的最大数。在树状数组中，维护一个数列大小size，每次插入就插入到第m - size的位置上，每次查询就查询前m - size + l项的最大值（前导零对答案不影响）。</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#75715e">//JSOI2008 maxnumber.cpp
</span><span style="color:#75715e"></span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;algorithm&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;iostream&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstring&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdlib&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdio&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;string&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cmath&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;stack&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;queue&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;map&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;set&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span>
<span style="color:#75715e">//#define LOCAL
</span><span style="color:#75715e">//#define READ_FILE
</span><span style="color:#75715e">//#define VISUAL_STUDIO
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL
</span><span style="color:#75715e">#define LOCAL_TIME
</span><span style="color:#75715e">#define LOCAL_DEBUG
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef VISUAL_STUDIO
</span><span style="color:#75715e">#pragma warning(disable: 4996)
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;ctime&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">int</span> m, d;
<span style="color:#66d9ef">int</span> size;
<span style="color:#66d9ef">char</span> op[<span style="color:#ae81ff">2</span>];
<span style="color:#66d9ef">int</span> op_num;
<span style="color:#66d9ef">int</span> t;
<span style="color:#66d9ef">int</span> interval[<span style="color:#ae81ff">200010</span>];

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">lowerbit</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> x)
{
    <span style="color:#66d9ef">return</span> x <span style="color:#f92672">&amp;</span> (<span style="color:#f92672">-</span>x);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">interval_query</span>(<span style="color:#66d9ef">int</span> x)
{
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">for</span> (; x <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>; x <span style="color:#f92672">-=</span> lowerbit(x))
    {
        ret <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(ret, interval[x]);
    }
    <span style="color:#66d9ef">return</span> ret;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">interval_add</span>(<span style="color:#66d9ef">int</span> x, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
    <span style="color:#66d9ef">for</span> (; x <span style="color:#f92672">&lt;=</span> m; x <span style="color:#f92672">+=</span> lowerbit(x))
    {
        interval[x] <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(interval[x], val);
    }
}

<span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">long</span> <span style="color:#66d9ef">long</span> start_time_ <span style="color:#f92672">=</span> clock();
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;maxnumber.in&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>, stdin);
    freopen(<span style="color:#e6db74">&#34;maxnumber.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    scanf(<span style="color:#e6db74">&#34;%d %d&#34;</span>, <span style="color:#f92672">&amp;</span>m, <span style="color:#f92672">&amp;</span>d);
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> m; i<span style="color:#f92672">++</span>)
    {
        scanf(<span style="color:#e6db74">&#34;%s %d&#34;</span>, op, <span style="color:#f92672">&amp;</span>op_num);
        <span style="color:#66d9ef">if</span> (op[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;Q&#39;</span>)
        {
            printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, t <span style="color:#f92672">=</span> interval_query(m <span style="color:#f92672">-</span> size <span style="color:#f92672">+</span> op_num));
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (op[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;A&#39;</span>)
        {
            op_num <span style="color:#f92672">=</span> (op_num <span style="color:#f92672">+</span> t) <span style="color:#f92672">%</span> d;
            interval_add(m <span style="color:#f92672">-</span> size, op_num);
            size<span style="color:#f92672">++</span>;
        }
    }
<span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    fclose(stdin);
    fclose(stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    fclose(stdin);
    fclose(stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
}
</code></pre></div>]]></content></item><item><title>[BZOJ2743][HEOI2012]采花（离线 + 树状数组）</title><link>https://www.sxn.dev/posts/heoi2012-flower/</link><pubDate>Sat, 17 May 2014 23:13:42 +0000</pubDate><guid>https://www.sxn.dev/posts/heoi2012-flower/</guid><description>&lt;p>打算开始学主席树了，然后发现好久没写树状数组，就找了道题练练手，谁知今天脑残不宜写题，WA了半天又T了半天。。&lt;/p></description><content type="html"><![CDATA[<p>打算开始学主席树了，然后发现好久没写树状数组，就找了道题练练手，谁知今天脑残不宜写题，WA了半天又T了半天。。</p>
<p>由于题目里要考虑这个区间后面还有没有这种颜色的花，那就把输入按r排序。首先我们需要一个数组f，在r确定的情况下，(f_i) 表示选择区间[i, r]能采(f_i)朵花，那么对于区间[l, r]的询问就是(f_l)的值。而r增加1变为j&rsquo;，此时第j&rsquo;朵花加入了区间，稍加分析就可以得到，(f_{pre_{pre_i}+1})到(f_{pre_i})都需加上1（(pre_i)表示与第i朵花颜色相同，且在第i朵花前的最后一朵花的编号），那么我们需要O(n)的时间预处理pre数组。但每次修改这么多数的时间复杂度是无法接受的，于是我们就用到了树状数组。用到一个数组a，其中：</p>
<p>(a_i = begin{cases} f_i &amp; (i = 1) \ f_i - f_{i-1} &amp; (i &gt; 1) end{cases} )</p>
<p>这时候区间修改已经转化为单点修改，将(f_{pre_{pre_i}+1})到(f_{pre_i})加上1就转化为(a_{pre_{pre_i}+1} + 1)，(a_{pre_i+1} - 1)，而(f_i = sumlimits_{j=1}^{i} a_j)，所以就可以通过树状数组维护a。（这是我这么久以来写过的最短的代码）</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#75715e">//HEOI2012 flower.cpp
</span><span style="color:#75715e"></span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;algorithm&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;iostream&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstring&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdlib&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdio&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;string&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cmath&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;queue&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;stack&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;map&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;set&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span>
<span style="color:#75715e">//#define LOCAL
</span><span style="color:#75715e">//#define READ_FILE
</span><span style="color:#75715e">//#define READ_FREAD
</span><span style="color:#75715e">//#define VISUAL_STUDIO
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXN <span style="color:#f92672">=</span> <span style="color:#ae81ff">1000010</span>;

<span style="color:#75715e">#ifdef LOCAL
</span><span style="color:#75715e">#define LOCAL_TIME
</span><span style="color:#75715e">#define LOCAL_DEBUG
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;ctime&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef VISUAL_STUDIO
</span><span style="color:#75715e">#pragma warning(disable: 4996)
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">query_node</span>
{
    <span style="color:#66d9ef">int</span> l, r, id;
    <span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">bool</span> <span style="color:#66d9ef">operator</span> <span style="color:#f92672">&lt;</span> (<span style="color:#66d9ef">const</span> query_node <span style="color:#f92672">&amp;</span>b) <span style="color:#66d9ef">const</span>
    {
        <span style="color:#66d9ef">return</span> r <span style="color:#f92672">&lt;</span> b.r;
    }
};

<span style="color:#66d9ef">int</span> n, c, m;
<span style="color:#66d9ef">int</span> color[MAXN];
query_node query[MAXN];
<span style="color:#66d9ef">int</span> pre[MAXN], last_color[MAXN];
<span style="color:#66d9ef">int</span> ans[MAXN];

<span style="color:#66d9ef">int</span> interval[MAXN];

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">lowerbit</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> x)
{
    <span style="color:#66d9ef">return</span> x <span style="color:#f92672">&amp;</span> (<span style="color:#f92672">-</span>x);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">interval_add</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> l, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> add)
{
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> l; i <span style="color:#f92672">&lt;=</span> n; i <span style="color:#f92672">+=</span> lowerbit(i))
    {
        interval[i] <span style="color:#f92672">+=</span> add;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">interval_sum</span>(<span style="color:#66d9ef">int</span> n)
{
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">while</span> (n <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>)
    {
        ret <span style="color:#f92672">+=</span> interval[n];
        n <span style="color:#f92672">-=</span> lowerbit(n);
    }
    <span style="color:#66d9ef">return</span> ret;
}

<span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">long</span> <span style="color:#66d9ef">long</span> start_time_ <span style="color:#f92672">=</span> clock();
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;flower.in&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>, stdin);
    freopen(<span style="color:#e6db74">&#34;flower.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    scanf(<span style="color:#e6db74">&#34;%d %d %d&#34;</span>, <span style="color:#f92672">&amp;</span>n, <span style="color:#f92672">&amp;</span>c, <span style="color:#f92672">&amp;</span>m);
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;=</span> n; i<span style="color:#f92672">++</span>)
    {
        scanf(<span style="color:#e6db74">&#34;%d&#34;</span>, color <span style="color:#f92672">+</span> i);
    }
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> m; i<span style="color:#f92672">++</span>)
    {
        scanf(<span style="color:#e6db74">&#34;%d %d&#34;</span>, <span style="color:#f92672">&amp;</span>query[i].l, <span style="color:#f92672">&amp;</span>query[i].r);
        query[i].id <span style="color:#f92672">=</span> i;
    }
    std<span style="color:#f92672">::</span>sort(query, query <span style="color:#f92672">+</span> m);
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;=</span> n; i<span style="color:#f92672">++</span>)
    {
        pre[i] <span style="color:#f92672">=</span> last_color[color[i]];
        last_color[color[i]] <span style="color:#f92672">=</span> i;
    }
    <span style="color:#66d9ef">int</span> last_right <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> m; i<span style="color:#f92672">++</span>)
    {
        <span style="color:#66d9ef">while</span> (query[i].r <span style="color:#f92672">&gt;</span> last_right)
        {
            last_right<span style="color:#f92672">++</span>;
            interval_add(pre[pre[last_right]] <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, <span style="color:#ae81ff">1</span>);
            interval_add(pre[last_right] <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>);
        }
        ans[query[i].id] <span style="color:#f92672">=</span> interval_sum(query[i].l);
    }
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> m; i<span style="color:#f92672">++</span>)
    {
        printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, ans[i]);
    }
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    printf(<span style="color:#e6db74">&#34;run time: %lld msn&#34;</span>, clock() <span style="color:#f92672">-</span> start_time_);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    fclose(stdin);
    fclose(stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
}
</code></pre></div>]]></content></item><item><title>[BZOJ1207][HNOI2005]虚拟内存（HASH + SPLAY）</title><link>https://www.sxn.dev/posts/hnoi2007-memory/</link><pubDate>Sat, 17 May 2014 16:15:33 +0000</pubDate><guid>https://www.sxn.dev/posts/hnoi2007-memory/</guid><description>&lt;p>我原本妄图做一道HASH乱搞题，本以为这道题可以HASH + 优先队列，后来发现好像不行，然后又蛋疼地敲平衡树了。一开始敲了个FANHQ_TREAP，结果被卡，一个点退化了，只好改SPLAY。虽然不是很快，不过完全不知道这道题开50S时限是什么心态。&lt;/p></description><content type="html"><![CDATA[<p>我原本妄图做一道HASH乱搞题，本以为这道题可以HASH + 优先队列，后来发现好像不行，然后又蛋疼地敲平衡树了。一开始敲了个FANHQ_TREAP，结果被卡，一个点退化了，只好改SPLAY。虽然不是很快，不过完全不知道这道题开50S时限是什么心态。</p>
<p>这题就用一个SPLAY根据题目的优先级维护内存中的所有点，再开HASH将内存中的内存编号映射到SPLAY的节点上。细节上再处理一下就好了。</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#75715e">//HNOI2005 DAY2 memory.cpp
</span><span style="color:#75715e"></span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;algorithm&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;iostream&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstring&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdlib&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdio&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;string&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cmath&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;queue&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;stack&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;map&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;set&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span>
<span style="color:#75715e">//#define LOCAL
</span><span style="color:#75715e">//#define VISUAL_STUDIO
</span><span style="color:#75715e"></span><span style="color:#75715e">#define READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define READ_FILE
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXN <span style="color:#f92672">=</span> <span style="color:#ae81ff">10000</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAX_HASH_LIST <span style="color:#f92672">=</span> <span style="color:#ae81ff">100000</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> HASH_BASE <span style="color:#f92672">=</span> <span style="color:#ae81ff">7</span>;

<span style="color:#75715e">#ifdef LOCAL
</span><span style="color:#75715e">#define LOCAL_TIME
</span><span style="color:#75715e">#define LOCAL_DEBUG
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define STD_DEBUG
</span><span style="color:#75715e"></span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef VISUAL_STUDIO
</span><span style="color:#75715e">#pragma warning(disable: 4996)
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;ctime&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#66d9ef">char</span> fread_char;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">fread_init</span>()
{
    fread_char <span style="color:#f92672">=</span> getchar();
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">get_int</span>()
{
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">while</span> ((fread_char <span style="color:#f92672">&lt;</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">||</span> (fread_char <span style="color:#f92672">&gt;</span> <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        fread_char <span style="color:#f92672">=</span> getchar();
    }
    <span style="color:#66d9ef">while</span> ((fread_char <span style="color:#f92672">&gt;=</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (fread_char <span style="color:#f92672">&lt;=</span> <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        ret <span style="color:#f92672">=</span> ret <span style="color:#f92672">*</span> <span style="color:#ae81ff">10</span> <span style="color:#f92672">+</span> fread_char <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;0&#39;</span>;
        fread_char <span style="color:#f92672">=</span> getchar();
    }
    <span style="color:#66d9ef">return</span> ret;
}
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">read</span>(<span style="color:#66d9ef">int</span> <span style="color:#f92672">&amp;</span>a)
{
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>    a <span style="color:#f92672">=</span> get_int();
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>    scanf(<span style="color:#e6db74">&#34;%d&#34;</span>, <span style="color:#f92672">&amp;</span>a);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#66d9ef">int</span> n, m, k, ans;
<span style="color:#66d9ef">int</span> splay_size;

<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">memory_node</span>
{
    <span style="color:#66d9ef">int</span> val;
    memory_node <span style="color:#f92672">*</span>next;
    <span style="color:#66d9ef">int</span> times, add_time;
    memory_node <span style="color:#f92672">*</span>parent, <span style="color:#f92672">*</span>l_child, <span style="color:#f92672">*</span>r_child;

    <span style="color:#66d9ef">inline</span> memory_node <span style="color:#f92672">*</span><span style="color:#a6e22e">init</span>()
    {
        next <span style="color:#f92672">=</span> NULL;
        parent <span style="color:#f92672">=</span> l_child <span style="color:#f92672">=</span> r_child <span style="color:#f92672">=</span> NULL;
        times <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
        <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">this</span>;
    }

    <span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">bool</span> <span style="color:#66d9ef">operator</span> <span style="color:#f92672">&lt;</span> (memory_node <span style="color:#f92672">&amp;</span>b) <span style="color:#66d9ef">const</span>
    {
        <span style="color:#66d9ef">if</span> (times <span style="color:#f92672">!=</span> b.times)
        {
            <span style="color:#66d9ef">return</span> times <span style="color:#f92672">&lt;</span> b.times;
        }
        <span style="color:#66d9ef">return</span> add_time <span style="color:#f92672">&lt;</span> b.add_time;
    }
};

memory_node recover_memory_node[MAXN];
memory_node <span style="color:#f92672">*</span>stack_memory_node[MAXN];
<span style="color:#66d9ef">int</span> top_stack_memory_node <span style="color:#f92672">=</span> MAXN;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">init_recover_memory</span>()
{
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> MAXN; i<span style="color:#f92672">++</span>)
    {
        stack_memory_node[i] <span style="color:#f92672">=</span> recover_memory_node <span style="color:#f92672">+</span> i;
        <span style="color:#75715e">//stack_memory_node[i]-&gt;rank = get_rank();
</span><span style="color:#75715e"></span>    }
}

<span style="color:#66d9ef">inline</span> memory_node <span style="color:#f92672">*</span><span style="color:#a6e22e">new_node</span>()
{
    <span style="color:#66d9ef">return</span> stack_memory_node[<span style="color:#f92672">--</span>top_stack_memory_node]<span style="color:#f92672">-&gt;</span>init();
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">delete_node</span>(memory_node <span style="color:#f92672">*</span>del_node)
{
    stack_memory_node[top_stack_memory_node<span style="color:#f92672">++</span>] <span style="color:#f92672">=</span> del_node;
}

memory_node <span style="color:#f92672">*</span>hash_list[MAX_HASH_LIST];

<span style="color:#66d9ef">char</span> hash_tmp[<span style="color:#ae81ff">11</span>];
<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">hash</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> k)
{
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    sprintf(hash_tmp, <span style="color:#e6db74">&#34;%d&#34;</span>, k);
    <span style="color:#66d9ef">int</span> length <span style="color:#f92672">=</span> strlen(hash_tmp);
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> length; i<span style="color:#f92672">++</span>)
    {
        ret <span style="color:#f92672">=</span> ret <span style="color:#f92672">*</span> HASH_BASE <span style="color:#f92672">+</span> hash_tmp[i] <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;0&#39;</span>;
        <span style="color:#66d9ef">if</span> (ret <span style="color:#f92672">&gt;=</span> MAX_HASH_LIST)
        {
            ret <span style="color:#f92672">%=</span> MAX_HASH_LIST;
        }
    }
    <span style="color:#66d9ef">return</span> ret;
}

<span style="color:#66d9ef">inline</span> memory_node <span style="color:#f92672">*</span><span style="color:#a6e22e">hash_find</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> k)
{
    memory_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> hash_list[hash(k)];
    <span style="color:#66d9ef">while</span> (tmp <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">==</span> k)
        {
            tmp<span style="color:#f92672">-&gt;</span>times<span style="color:#f92672">++</span>;
            <span style="color:#66d9ef">return</span> tmp;
        }
        tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>next;
    }
    <span style="color:#66d9ef">return</span> NULL;
}

<span style="color:#66d9ef">inline</span> memory_node <span style="color:#f92672">*</span><span style="color:#a6e22e">hash_insert</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> k, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>)
{
    memory_node <span style="color:#f92672">*</span>new_pt <span style="color:#f92672">=</span> new_node();
    new_pt<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">=</span> k;
    <span style="color:#66d9ef">if</span> (i <span style="color:#f92672">!=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>)
    {
        new_pt<span style="color:#f92672">-&gt;</span>add_time <span style="color:#f92672">=</span> i;
    }
    <span style="color:#66d9ef">int</span> hash_tmp <span style="color:#f92672">=</span> hash(k);
    new_pt<span style="color:#f92672">-&gt;</span>next <span style="color:#f92672">=</span> hash_list[hash_tmp];
    hash_list[hash_tmp] <span style="color:#f92672">=</span> new_pt;
    <span style="color:#66d9ef">return</span> new_pt;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">hash_delete</span>(memory_node <span style="color:#f92672">*</span>del_node)
{
    <span style="color:#66d9ef">int</span> tmp_hash <span style="color:#f92672">=</span> hash(del_node<span style="color:#f92672">-&gt;</span>val);
    <span style="color:#66d9ef">if</span> (hash_list[tmp_hash] <span style="color:#f92672">==</span> del_node)
    {
        hash_list[tmp_hash] <span style="color:#f92672">=</span> del_node<span style="color:#f92672">-&gt;</span>next;
    }
    <span style="color:#66d9ef">else</span>
    {
        memory_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> hash_list[tmp_hash];
        <span style="color:#66d9ef">while</span> (tmp<span style="color:#f92672">-&gt;</span>next <span style="color:#f92672">!=</span> del_node)
        {
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>next;
        }
        tmp<span style="color:#f92672">-&gt;</span>next <span style="color:#f92672">=</span> del_node<span style="color:#f92672">-&gt;</span>next;
    }
    delete_node(del_node);
}

memory_node <span style="color:#f92672">*</span>splay_head <span style="color:#f92672">=</span> NULL;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">attach_as_l_child</span>(memory_node <span style="color:#f92672">*</span>parent, memory_node <span style="color:#f92672">*</span>child)
{
    parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> child;
    <span style="color:#66d9ef">if</span> (child <span style="color:#f92672">!=</span> NULL)
    {
        child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">attach_as_r_child</span>(memory_node <span style="color:#f92672">*</span>parent, memory_node <span style="color:#f92672">*</span>child)
{
    parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> child;
    <span style="color:#66d9ef">if</span> (child <span style="color:#f92672">!=</span> NULL)
    {
        child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_zig</span>(memory_node <span style="color:#f92672">*</span>axis)
{
    memory_node <span style="color:#f92672">*</span>left_child <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>l_child;
    memory_node <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>parent;
    attach_as_l_child(axis, left_child<span style="color:#f92672">-&gt;</span>r_child);
    attach_as_r_child(left_child, axis);
    left_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    <span style="color:#66d9ef">if</span> (parent <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> axis)
        {
            parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> left_child;
        }
        <span style="color:#66d9ef">else</span>
        {
            parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> left_child;
        }
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_zag</span>(memory_node <span style="color:#f92672">*</span>axis)
{
    memory_node <span style="color:#f92672">*</span>right_child <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>r_child;
    memory_node <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>parent;
    attach_as_r_child(axis, right_child<span style="color:#f92672">-&gt;</span>l_child);
    attach_as_l_child(right_child, axis);
    right_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    <span style="color:#66d9ef">if</span> (parent <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> axis)
        {
            parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> right_child;
        }
        <span style="color:#66d9ef">else</span>
        {
            parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> right_child;
        }
    }
}

<span style="color:#66d9ef">inline</span> memory_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_route</span>(memory_node <span style="color:#f92672">*</span>v)
{
    memory_node <span style="color:#f92672">*</span>parent, <span style="color:#f92672">*</span>grand_parent;
    <span style="color:#66d9ef">while</span> (((parent <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>parent) <span style="color:#f92672">!=</span> NULL) <span style="color:#f92672">&amp;&amp;</span> ((grand_parent <span style="color:#f92672">=</span> parent<span style="color:#f92672">-&gt;</span>parent) <span style="color:#f92672">!=</span> NULL))
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> v)
        {
            <span style="color:#66d9ef">if</span> (grand_parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> parent)
            {
                splay_zig(grand_parent);
                splay_zig(parent);
            }
            <span style="color:#66d9ef">else</span>
            {
                splay_zig(parent);
                splay_zag(grand_parent);
            }
        }
        <span style="color:#66d9ef">else</span>
        {
            <span style="color:#66d9ef">if</span> (grand_parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">==</span> parent)
            {
                splay_zag(grand_parent);
                splay_zag(parent);
            }
            <span style="color:#66d9ef">else</span>
            {
                splay_zag(parent);
                splay_zig(grand_parent);
            }
        }
    }
    <span style="color:#66d9ef">if</span> ((parent <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>parent) <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> v)
        {
            splay_zig(parent);
        }
        <span style="color:#66d9ef">else</span>
        {
            splay_zag(parent);
        }
    }
    <span style="color:#66d9ef">return</span> v;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_insert</span>(memory_node <span style="color:#f92672">*</span>insert_node)
{
    <span style="color:#66d9ef">if</span> (splay_head <span style="color:#f92672">==</span> NULL)
    {
        splay_head <span style="color:#f92672">=</span> insert_node;
    }
    <span style="color:#66d9ef">else</span>
    {
        memory_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> splay_head;
        memory_node <span style="color:#f92672">*</span>last_visit <span style="color:#f92672">=</span> NULL;
        <span style="color:#66d9ef">while</span> (tmp <span style="color:#f92672">!=</span> NULL)
        {
            last_visit <span style="color:#f92672">=</span> tmp;
            <span style="color:#66d9ef">if</span> (<span style="color:#f92672">*</span>tmp <span style="color:#f92672">&lt;</span> <span style="color:#f92672">*</span>insert_node)
            {
                tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>r_child;
            }
            <span style="color:#66d9ef">else</span>
            {
                tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>l_child;
            }
        }
        <span style="color:#66d9ef">if</span> (<span style="color:#f92672">*</span>last_visit <span style="color:#f92672">&lt;</span> <span style="color:#f92672">*</span>insert_node)
        {
            attach_as_r_child(last_visit, insert_node);
        }
        <span style="color:#66d9ef">else</span>
        {
            attach_as_l_child(last_visit, insert_node);
        }
        splay_head <span style="color:#f92672">=</span> splay_route(insert_node);
    }
}

<span style="color:#66d9ef">inline</span> memory_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_top</span>()
{
    <span style="color:#66d9ef">for</span> (memory_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> splay_head; tmp <span style="color:#f92672">!=</span> NULL; tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>l_child)
    {
        <span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> NULL)
        {
            <span style="color:#66d9ef">return</span> tmp;
        }
    }
    <span style="color:#66d9ef">return</span> NULL;
}

<span style="color:#66d9ef">inline</span> memory_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_bottom</span>(memory_node <span style="color:#f92672">*</span>root <span style="color:#f92672">=</span> splay_head)
{
    <span style="color:#66d9ef">for</span> (memory_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> root; tmp <span style="color:#f92672">!=</span> NULL; tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>r_child)
    {
        <span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">==</span> NULL)
        {
            <span style="color:#66d9ef">return</span> tmp;
        }
    }
    <span style="color:#66d9ef">return</span> NULL;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_delete</span>(memory_node <span style="color:#f92672">*</span>del_node)
{
    splay_head <span style="color:#f92672">=</span> splay_route(del_node);
    <span style="color:#66d9ef">if</span> (splay_head<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> NULL)
    {
        splay_head <span style="color:#f92672">=</span> splay_head<span style="color:#f92672">-&gt;</span>r_child;
        <span style="color:#66d9ef">if</span> (splay_head <span style="color:#f92672">!=</span> NULL)
        {
            splay_head<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> NULL;
        }
    }
    <span style="color:#66d9ef">else</span>
    {
        memory_node <span style="color:#f92672">*</span>left_root <span style="color:#f92672">=</span> splay_route(splay_bottom(splay_head<span style="color:#f92672">-&gt;</span>l_child));
        attach_as_r_child(left_root, splay_head<span style="color:#f92672">-&gt;</span>r_child);
        splay_head <span style="color:#f92672">=</span> left_root;
    }
    del_node<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> del_node<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> del_node<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> NULL;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">memory_read</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> k, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> i)
{
    memory_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> hash_find(k);
    <span style="color:#66d9ef">if</span> (tmp <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (splay_size <span style="color:#f92672">&lt;</span> n)
        {
            tmp <span style="color:#f92672">=</span> hash_insert(k, i);
            splay_insert(tmp);
            splay_size<span style="color:#f92672">++</span>;
        }
        <span style="color:#66d9ef">else</span>
        {
            tmp <span style="color:#f92672">=</span> splay_top();
            splay_delete(tmp);
            hash_delete(tmp);
            tmp <span style="color:#f92672">=</span> hash_insert(k, i);
            splay_insert(tmp);
        }
    }
    <span style="color:#66d9ef">else</span>
    {
        ans<span style="color:#f92672">++</span>;
        splay_delete(tmp);
        tmp<span style="color:#f92672">-&gt;</span>times<span style="color:#f92672">++</span>;
        splay_insert(tmp);
    }
}

<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span><span style="color:#66d9ef">int</span> max_deepen;
<span style="color:#66d9ef">int</span> <span style="color:#a6e22e">splay_checker</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> deepen, memory_node <span style="color:#f92672">*</span>root <span style="color:#f92672">=</span> splay_head)
{
    <span style="color:#66d9ef">if</span> (root <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
    }
    max_deepen <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(max_deepen, deepen);
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
    ret <span style="color:#f92672">+=</span> splay_checker(deepen <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, root<span style="color:#f92672">-&gt;</span>l_child);
    ret <span style="color:#f92672">+=</span> splay_checker(deepen <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, root<span style="color:#f92672">-&gt;</span>r_child);
    <span style="color:#66d9ef">return</span> ret;
}
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">long</span> <span style="color:#66d9ef">long</span> start_time_ <span style="color:#f92672">=</span> clock();
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;memory.in&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>, stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;memory.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>    fread_init();
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    init_recover_memory();
    read(n);
    read(m);
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> m; i<span style="color:#f92672">++</span>)
    {
        read(k);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>        printf(<span style="color:#e6db74">&#34;%d %dn&#34;</span>, i, k);
        <span style="color:#66d9ef">if</span> (i <span style="color:#f92672">==</span> <span style="color:#ae81ff">2</span>)
        {
            printf(<span style="color:#e6db74">&#34;&#34;</span>);
        }
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>        memory_read(k, i);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>        max_deepen <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
        <span style="color:#66d9ef">if</span> (splay_checker(<span style="color:#ae81ff">1</span>) <span style="color:#f92672">!=</span> splay_size)
        {
            printf(<span style="color:#e6db74">&#34;SIZE_ERRORn&#34;</span>);
        }
        <span style="color:#75715e">//printf(&#34;%dn&#34;, max_deepen);
</span><span style="color:#75715e"></span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    }
    printf(<span style="color:#e6db74">&#34;%d&#34;</span>, ans);
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    printf(<span style="color:#e6db74">&#34;nrun time: %lld ms&#34;</span>, clock() <span style="color:#f92672">-</span> start_time_);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    fclose(stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>    fclose(stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
}
</code></pre></div>]]></content></item><item><title>[BZOJ1003][ZJOI2006]物流运输（DP + DIJKSTRA）</title><link>https://www.sxn.dev/posts/zjoi2006-trans/</link><pubDate>Sat, 17 May 2014 07:39:32 +0000</pubDate><guid>https://www.sxn.dev/posts/zjoi2006-trans/</guid><description>&lt;p>好吧这就是一道大水题，很显然的DP思路。DP状态转移方程就是(dp_i = text{min}(f_{1,i}, dp_j + k + f_{j+1,i}) (1 leq j &amp;lt; i))，其中(f_{i,j})表示从i时刻到j时刻（包括i和j）走同一条路所需的总成本。而由于n和m都很小，这个直接暴力标记不能走的点然后做一次DIJKSTRA就可以了，同时把已经计算过的(f_{i,j})存下来，以便下次使用。这样的话总体的时间复杂度大概就是（原谅我不会算，随便乱估计的）(text{O}(n^2 log_2 m))。&lt;/p></description><content type="html"><![CDATA[<p>好吧这就是一道大水题，很显然的DP思路。DP状态转移方程就是(dp_i = text{min}(f_{1,i}, dp_j + k + f_{j+1,i}) (1 leq j &lt; i))，其中(f_{i,j})表示从i时刻到j时刻（包括i和j）走同一条路所需的总成本。而由于n和m都很小，这个直接暴力标记不能走的点然后做一次DIJKSTRA就可以了，同时把已经计算过的(f_{i,j})存下来，以便下次使用。这样的话总体的时间复杂度大概就是（原谅我不会算，随便乱估计的）(text{O}(n^2 log_2 m))。</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#75715e">//ZJOI 2006 day1 trans.cpp
</span><span style="color:#75715e"></span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;algorithm&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;iostream&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstring&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdlib&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdio&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;string&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cmath&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;queue&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;stack&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;set&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;map&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span>
<span style="color:#75715e">//#define LOCAL
</span><span style="color:#75715e">//#define READ_FILE
</span><span style="color:#75715e">//#define VISUAL_STUDIO
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXM <span style="color:#f92672">=</span> <span style="color:#ae81ff">22</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXD <span style="color:#f92672">=</span> <span style="color:#ae81ff">100</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXN <span style="color:#f92672">=</span> <span style="color:#ae81ff">110</span>;

<span style="color:#75715e">#ifdef LOCAL
</span><span style="color:#75715e">#define LOCAL_TIME
</span><span style="color:#75715e">#define LOCAL_DEBUG
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef VISUAL_STUDIO
</span><span style="color:#75715e">#pragma warning(disable: 4996)
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;ctime&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">edge_node</span>
{
    <span style="color:#66d9ef">int</span> to;
    <span style="color:#66d9ef">int</span> val;
    edge_node <span style="color:#f92672">*</span>next;
    <span style="color:#66d9ef">inline</span> <span style="color:#a6e22e">edge_node</span>()
    {
        next <span style="color:#f92672">=</span> NULL;
    }
};

<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">unable_node</span>
{
    <span style="color:#66d9ef">int</span> node, begin, end;
};

<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">queue_node</span>
{
    <span style="color:#66d9ef">int</span> node;
    <span style="color:#66d9ef">int</span> val;
    <span style="color:#66d9ef">inline</span> <span style="color:#a6e22e">queue_node</span>()
    {

    }
    <span style="color:#66d9ef">inline</span> <span style="color:#a6e22e">queue_node</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> node_, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val_)
    {
        node <span style="color:#f92672">=</span> node_;
        val <span style="color:#f92672">=</span> val_;
    }
    <span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">bool</span> <span style="color:#66d9ef">operator</span> <span style="color:#f92672">&lt;</span> (<span style="color:#66d9ef">const</span> queue_node <span style="color:#f92672">&amp;</span>b) <span style="color:#66d9ef">const</span>
    {
        <span style="color:#66d9ef">if</span> (val <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>)
        {
            <span style="color:#66d9ef">return</span> true;
        }
        <span style="color:#66d9ef">else</span> <span style="color:#a6e22e">if</span> (b.val <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>)
        {
            <span style="color:#66d9ef">return</span> false;
        }
        <span style="color:#66d9ef">return</span> val <span style="color:#f92672">&gt;</span> b.val;
    }
};

std<span style="color:#f92672">::</span>priority_queue <span style="color:#f92672">&lt;</span>queue_node<span style="color:#f92672">&gt;</span> Q;
queue_node tmp;
<span style="color:#66d9ef">int</span> val[MAXN];
<span style="color:#66d9ef">bool</span> visit[MAXN];
<span style="color:#66d9ef">int</span> n, m, k, e, d;
edge_node edge[MAXM <span style="color:#f92672">*</span> MAXM];
<span style="color:#66d9ef">int</span> edge_top;
edge_node<span style="color:#f92672">*</span> edge_head[MAXM];
<span style="color:#66d9ef">int</span> l, r, v;
unable_node unable[MAXD];
<span style="color:#66d9ef">bool</span> sign_able[MAXN];
<span style="color:#66d9ef">int</span> f[MAXN][MAXN];
<span style="color:#66d9ef">int</span> dp[MAXN];
<span style="color:#66d9ef">int</span> ans;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">add_edge</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> l, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> r, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
    edge[edge_top].to <span style="color:#f92672">=</span> r;
    edge[edge_top].val <span style="color:#f92672">=</span> val;
    edge[edge_top].next <span style="color:#f92672">=</span> edge_head[l];
    edge_head[l] <span style="color:#f92672">=</span> edge <span style="color:#f92672">+</span> edge_top<span style="color:#f92672">++</span>;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">min</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> a, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> b)
{
    <span style="color:#66d9ef">if</span> (a <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>)
    {
        <span style="color:#66d9ef">return</span> b;
    }
    <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (b <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>)
    {
        <span style="color:#66d9ef">return</span> a;
    }
    <span style="color:#66d9ef">return</span> a <span style="color:#f92672">&lt;</span> b <span style="color:#f92672">?</span> a : b;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">dijkstra</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> begin, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> end)
{
    memset(val, <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>, <span style="color:#66d9ef">sizeof</span>(val));
    memset(visit, <span style="color:#ae81ff">0</span>, <span style="color:#66d9ef">sizeof</span>(visit));
    val[begin] <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    Q.push(queue_node(begin, <span style="color:#ae81ff">0</span>));
    <span style="color:#66d9ef">while</span> (<span style="color:#f92672">!</span>Q.empty())
    {
        tmp <span style="color:#f92672">=</span> Q.top();
        Q.pop();
        <span style="color:#66d9ef">if</span> (visit[tmp.node])
        {
            <span style="color:#66d9ef">continue</span>;
        }
        visit[tmp.node] <span style="color:#f92672">=</span> true;
        <span style="color:#66d9ef">for</span> (edge_node <span style="color:#f92672">*</span>e <span style="color:#f92672">=</span> edge_head[tmp.node]; e <span style="color:#f92672">!=</span> NULL; e <span style="color:#f92672">=</span> e<span style="color:#f92672">-&gt;</span>next)
        {
            <span style="color:#66d9ef">if</span> (sign_able[e<span style="color:#f92672">-&gt;</span>to])
            {
                <span style="color:#66d9ef">if</span> ((val[e<span style="color:#f92672">-&gt;</span>to] <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>) <span style="color:#f92672">||</span> (val[e<span style="color:#f92672">-&gt;</span>to] <span style="color:#f92672">&gt;</span> val[tmp.node] <span style="color:#f92672">+</span> e<span style="color:#f92672">-&gt;</span>val))
                {
                    val[e<span style="color:#f92672">-&gt;</span>to] <span style="color:#f92672">=</span> val[tmp.node] <span style="color:#f92672">+</span> e<span style="color:#f92672">-&gt;</span>val;
                    visit[e<span style="color:#f92672">-&gt;</span>to] <span style="color:#f92672">=</span> false;
                    Q.push(queue_node(e<span style="color:#f92672">-&gt;</span>to, val[e<span style="color:#f92672">-&gt;</span>to]));
                }
            }
        }
    }
    <span style="color:#66d9ef">return</span> val[end];
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">min_val</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> begin, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> end)
{
    <span style="color:#66d9ef">if</span> (f[begin][end] <span style="color:#f92672">!=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>)
    {
        <span style="color:#66d9ef">return</span> f[begin][end];
    }
    memset(sign_able, <span style="color:#ae81ff">1</span>, <span style="color:#66d9ef">sizeof</span>(sign_able));
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> d; i<span style="color:#f92672">++</span>)
    {
        <span style="color:#66d9ef">if</span> ((unable[i].begin <span style="color:#f92672">&lt;=</span> end) <span style="color:#f92672">&amp;&amp;</span> (unable[i].end <span style="color:#f92672">&gt;=</span> begin))
        {
            sign_able[unable[i].node] <span style="color:#f92672">=</span> false;
        }
    }
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>    printf(<span style="color:#e6db74">&#34;DIJ: %d %d %dn&#34;</span>, begin, end, dijkstra(<span style="color:#ae81ff">1</span>, m));
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">return</span> f[begin][end] <span style="color:#f92672">=</span> (end <span style="color:#f92672">-</span> begin <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>) <span style="color:#f92672">*</span> dijkstra(<span style="color:#ae81ff">1</span>, m);
}

<span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">long</span> <span style="color:#66d9ef">long</span> start_time_ <span style="color:#f92672">=</span> clock();
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;1003.in&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>, stdin);
    freopen(<span style="color:#e6db74">&#34;1003.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    scanf(<span style="color:#e6db74">&#34;%d %d %d %d&#34;</span>, <span style="color:#f92672">&amp;</span>n, <span style="color:#f92672">&amp;</span>m, <span style="color:#f92672">&amp;</span>k, <span style="color:#f92672">&amp;</span>e);
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> e; i<span style="color:#f92672">++</span>)
    {
        scanf(<span style="color:#e6db74">&#34;%d %d %d&#34;</span>, <span style="color:#f92672">&amp;</span>l, <span style="color:#f92672">&amp;</span>r, <span style="color:#f92672">&amp;</span>v);
        add_edge(l, r, v);
        add_edge(r, l, v);
    }
    scanf(<span style="color:#e6db74">&#34;%d&#34;</span>, <span style="color:#f92672">&amp;</span>d);
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> d; i<span style="color:#f92672">++</span>)
    {
        scanf(<span style="color:#e6db74">&#34;%d %d %d&#34;</span>, <span style="color:#f92672">&amp;</span>unable[i].node, <span style="color:#f92672">&amp;</span>unable[i].begin, <span style="color:#f92672">&amp;</span>unable[i].end);
    }
    memset(dp, <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>, <span style="color:#66d9ef">sizeof</span>(dp));
    memset(f, <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>, <span style="color:#66d9ef">sizeof</span>(f));
    dp[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;=</span> n; i<span style="color:#f92672">++</span>)
    {
        dp[i] <span style="color:#f92672">=</span> min_val(<span style="color:#ae81ff">1</span>, i);
        <span style="color:#66d9ef">if</span> (dp[i] <span style="color:#f92672">&lt;=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>)
        {
            dp[i] <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
        }
        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> j <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; j <span style="color:#f92672">&lt;</span> i; j<span style="color:#f92672">++</span>)
        {
            <span style="color:#66d9ef">if</span> ((min_val(j <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, i) <span style="color:#f92672">&gt;</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>) <span style="color:#f92672">&amp;&amp;</span> (dp[j] <span style="color:#f92672">&gt;</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>))
            {
                dp[i] <span style="color:#f92672">=</span> min(dp[i], dp[j] <span style="color:#f92672">+</span> k <span style="color:#f92672">+</span> min_val(j <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, i));
            }
        }
    }
    printf(<span style="color:#e6db74">&#34;%d&#34;</span>, dp[n]);
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    printf(<span style="color:#e6db74">&#34;nrun time: %lld msn&#34;</span>, clock() <span style="color:#f92672">-</span> start_time_);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    fclose(stdin);
    fclose(stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
}
</code></pre></div>]]></content></item><item><title>[BZOJ1002][FJOI2007]轮状病毒（DP + 高精度）</title><link>https://www.sxn.dev/posts/fjoi2007-virus/</link><pubDate>Fri, 16 May 2014 15:25:47 +0000</pubDate><guid>https://www.sxn.dev/posts/fjoi2007-virus/</guid><description>&lt;p>这题的DP实在是太可怕，证明了半天，其实就是排列组合。最后证明出来的式子是&lt;/p>
&lt;p>(f_n = \begin{cases} 1 &amp;amp; (n = 1) \ 2 &amp;amp; (n = 2) \ 3 * f_{n-1} - f_{n-2} + 2 &amp;amp; (n \geq 3) \end{cases})&lt;/p></description><content type="html"><![CDATA[<p>这题的DP实在是太可怕，证明了半天，其实就是排列组合。最后证明出来的式子是</p>
<p>(f_n = \begin{cases} 1 &amp; (n = 1) \ 2 &amp; (n = 2) \ 3 * f_{n-1} - f_{n-2} + 2 &amp; (n \geq 3) \end{cases})</p>
<p>下面开始证明了（LaTeX真是个好东西）：</p>
<p>首先我们设最后要得到的答案是(f_n)，设i个成链状的外围点和中心点组成的图的生成树总数为(g_i)。</p>
<p>先考虑(g_i)。显然(g_0 = g_1 = 1)（此时只有一个中心点，或只有一个中心点和一个外围点）。</p>
<p>然后对于(i \geq 2)，这种情况可以由(g_{i-j} (1 \leq j &lt; i))的情况加上i-j个点得到。这里我们只考虑这j-i个点连成一条链，且有一个点与中心点相连的情况，并且仅考虑这i-j个点接在j个点后。稍加考虑即可知道其他的情况都是重复的。而这i-j个点共有i-j种组合（每个点都有可能连接中心点）。于是就可以得到：</p>
<p>(\begin{eqnarray*}g_i &amp; = &amp; \sum\limits_{j=1}^{i-1} (i - j) * (g_j) &amp; (1)\g_{i-1} &amp; = &amp; \sum\limits_{j=1}^{i-2} (i - j - 1) * (g_j) &amp; (2)\end{eqnarray*})</p>
<p>(1) - (2)可得</p>
<p>(g_i - g_{i-1} = [i - (i - 1)] * g_{i-1} + \sum\limits_{j=1}^{i-2} g_j)</p>
<p>所以</p>
<p>(\begin{eqnarray*}g_i &amp; = &amp; g_{i-1} + \sum\limits_{j=1}^{i-1} g_j &amp; (3)\g_{i-1} &amp; = &amp; g_{i-2} + \sum\limits_{j=1}^{i-2} g_j &amp; (4)\end{eqnarray*})</p>
<p>(3) - (4)可得</p>
<p>(g_i - g_{i-1} = g_{i-1} - g_{i-2} + \sum\limits_{j=1}^{i-1} g_j - \sum\limits_{j=1}^{i-2} g_j)</p>
<p>所以</p>
<p>(g_i = 3 * g_{i-1} - g_{i-2} (i \geq 2))</p>
<p>综上所述</p>
<p>(g_i = \begin{cases} 1 &amp; (i = 0, 1) \ 3 &amp; (i = 2) \ 3 * g_{i-1} - g_{i-2} &amp; (i \geq 3) \end{cases})</p>
<p>到这里(g_i)已经推完了，现在要用(g_i)来推(f_n)。这次我们要枚举外围点中最上面那个点（选其他的点也可以）所在的链的长度(该链有一个点与中心点相连），我们只需考虑其中一个点，因为其他的情况都是重复的。若该点所在的链的长度为i，则该链覆盖的点共有i种可能，对于每种可能，又有i种组合（每个点都可能连接中心点），所以共有(i^2)种可能。而对于剩下的n-i个点，即有(g_{n-i})种。所以可以得到：</p>
<p>(\begin{eqnarray*}f_n &amp; = &amp; \sum\limits_{i=1}^{n} i^2 * g_{n-i}\ &amp; = &amp; \sum\limits_{i=1}^{n-3} (i^2 * 3 * g_{n-i-1} - i^2 * g_{n-i-2}) + (n - 2)^2 * g_2 + (n - 1)^2 * g_1 + n^2 * g_0 \end{eqnarray*})</p>
<p>又</p>
<p>(\begin{eqnarray*}f_{n-1} &amp; = &amp; \sum\limits_{i=1}^{n-1} i^2 * g_{n-i-1} \ &amp; = &amp; \sum\limits_{i=1}^{n-3} i^2 * g_{n-i-1} + (n - 2)^2 * g_1 + (n - 1)^2 * g_0 \end{eqnarray*})</p>
<p>(\begin{eqnarray*}f_{n-2} &amp; = &amp; \sum\limits_{i=1}^{n-2} i^2 * g_{n-i-2} \ &amp; = &amp; \sum\limits_{i=1}^{n-3} i^2 * g_{n-i-2} + (n - 2)^2 * g_0 \end{eqnarray*})</p>
<p>则</p>
<p>(\begin{eqnarray*}3 * f_{n-1} - f_{n-2} &amp; = &amp; 3 * [\sum\limits_{i=1}^{n-3} i^2 * g_{n-i-1} + (n - 2)^2 * g_1 + (n - 1)^2 * g_0] - \sum\limits_{i=1}^{n-3} i^2 * g_{n-i-2} + (n - 2)^2 * g_0 \ &amp; = &amp; \sum\limits_{i=1}^{n-3} (3 * i^2 * g_{n-i-1} - i^2 * g_{n-i-2}) + 3 * (n - 2)^2 * g_1 + 3 * (n - 1)^2 * g_{0} - (n - 2)^2 * g_0 \ &amp; = &amp; f_n - (n - 2)^2 * g_2 - (n - 1)^2 * g_1 - n^2 * g_0 + 3 * (n - 2)^2 * g_1 + 3 * (n - 1)^2 * g_0 - (n - 2)^2 * g_0 \ &amp; = &amp; f_n - (n^2 - 4n - 4) * 3 - (n^2 - 2n + 1) * 1 - n^2 * 1 + 3 * (n^2 - 4n + 4) * 1 + 3 * (n^2 - 2n + 1) * 1 - (n^2 - 4n + 4) * 1 \ &amp; = &amp; f_n - 2 \end{eqnarray*})</p>
<p>所以</p>
<p>(f_n = 3 * f_{n-1} - f_{n-2} + 2 (n \geq 3))</p>
<p>综上所述</p>
<p>(f_n = \begin{cases} 1 &amp; (n = 1) \ 2 &amp; (n = 2) \ 3 * f_{n-1} - f_{n-2} + 2 &amp; (n \geq 3) \end{cases})</p>
<p>我总觉得会有更简单的证法，当然还见过什么分奇偶找规律的，还有什么基尔霍夫矩阵（那是什么，没听说过），有空再去想了。</p>
<p>证明完之后，还要一个高精度，然后就是水题了。听说N只有100，直接上代码：</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#75715e">//FJOI 2007 virus.cpp
</span><span style="color:#75715e"></span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;algorithm&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;iostream&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstring&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdlib&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdio&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;string&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cmath&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;queue&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;stack&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;map&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;set&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span>
<span style="color:#75715e">//#define LOCAL
</span><span style="color:#75715e">//#define READ_FILE
</span><span style="color:#75715e">//#define VISUAL_STUDIO
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXBIT <span style="color:#f92672">=</span> <span style="color:#ae81ff">1000</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXN <span style="color:#f92672">=</span> <span style="color:#ae81ff">110</span>;

<span style="color:#75715e">#ifdef LOCAL
</span><span style="color:#75715e">#define LOCAL_TIME
</span><span style="color:#75715e">#define LOCAL_DEBUG
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef VISUAL_STUDIO
</span><span style="color:#75715e">#pragma warning(disable:4996)
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;ctime&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">bign</span>
{
    <span style="color:#66d9ef">int</span> val[MAXBIT];
    <span style="color:#66d9ef">int</span> length;
    <span style="color:#66d9ef">inline</span> <span style="color:#a6e22e">bign</span>()
    {
        memset(val, <span style="color:#ae81ff">0</span>, MAXBIT);
        length <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
    }
    <span style="color:#66d9ef">inline</span> <span style="color:#a6e22e">bign</span>(<span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>a)
    {
        memset(val, <span style="color:#ae81ff">0</span>, MAXBIT);
        length <span style="color:#f92672">=</span> strlen(a);
        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> length; i<span style="color:#f92672">++</span>)
        {
            val[i] <span style="color:#f92672">=</span> a[length <span style="color:#f92672">-</span> i <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;0&#39;</span>;
        }
    }
    <span style="color:#66d9ef">inline</span> <span style="color:#a6e22e">bign</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> a)
    {
        memset(val, <span style="color:#ae81ff">0</span>, MAXBIT);
        <span style="color:#66d9ef">char</span> tmp[MAXBIT];
        sprintf(tmp, <span style="color:#e6db74">&#34;%d&#34;</span>, a);
        <span style="color:#f92672">*</span><span style="color:#66d9ef">this</span> <span style="color:#f92672">=</span> bign(tmp);
    }
    <span style="color:#66d9ef">inline</span> bign <span style="color:#66d9ef">operator</span> <span style="color:#f92672">=</span> (<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> a)
    {
        <span style="color:#66d9ef">return</span> <span style="color:#f92672">*</span><span style="color:#66d9ef">this</span> <span style="color:#f92672">=</span> bign(a);
    }
    <span style="color:#66d9ef">inline</span> bign <span style="color:#66d9ef">operator</span> <span style="color:#f92672">=</span> (<span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>a)
    {
        <span style="color:#66d9ef">return</span> <span style="color:#f92672">*</span><span style="color:#66d9ef">this</span> <span style="color:#f92672">=</span> bign(a);
    }
    <span style="color:#66d9ef">inline</span> bign <span style="color:#66d9ef">operator</span> <span style="color:#f92672">*</span> (<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> b) <span style="color:#66d9ef">const</span>
    {
        <span style="color:#66d9ef">int</span> tmp <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
        bign c;
        c.length <span style="color:#f92672">=</span> length;
        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> c.length; i<span style="color:#f92672">++</span>)
        {
            c.val[i] <span style="color:#f92672">=</span> val[i] <span style="color:#f92672">*</span> b <span style="color:#f92672">+</span> tmp;
            tmp <span style="color:#f92672">=</span> c.val[i] <span style="color:#f92672">/</span> <span style="color:#ae81ff">10</span>;
            c.val[i] <span style="color:#f92672">%=</span> <span style="color:#ae81ff">10</span>;
        }
        <span style="color:#66d9ef">while</span> (tmp <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>)
        {
            c.val[c.length<span style="color:#f92672">++</span>] <span style="color:#f92672">=</span> tmp <span style="color:#f92672">%</span> <span style="color:#ae81ff">10</span>;
            tmp <span style="color:#f92672">/=</span> <span style="color:#ae81ff">10</span>;
        }
        <span style="color:#66d9ef">return</span> c;
    }
    <span style="color:#66d9ef">inline</span> bign <span style="color:#66d9ef">operator</span> <span style="color:#f92672">+</span> (<span style="color:#66d9ef">const</span> bign <span style="color:#f92672">&amp;</span>b) <span style="color:#66d9ef">const</span>
    {
        <span style="color:#66d9ef">int</span> tmp <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
        bign c;
        c.length <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(length, b.length);
        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> c.length; i<span style="color:#f92672">++</span>)
        {
            c.val[i] <span style="color:#f92672">=</span> val[i] <span style="color:#f92672">+</span> b.val[i] <span style="color:#f92672">+</span> tmp;
            tmp <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
            <span style="color:#66d9ef">if</span> (c.val[i] <span style="color:#f92672">&gt;=</span> <span style="color:#ae81ff">10</span>)
            {
                tmp <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
                c.val[i] <span style="color:#f92672">-=</span> <span style="color:#ae81ff">10</span>;
            }
        }
        <span style="color:#66d9ef">if</span> (tmp <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>)
        {
            c.val[c.length<span style="color:#f92672">++</span>] <span style="color:#f92672">=</span> tmp;
            tmp <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
        }
        <span style="color:#66d9ef">return</span> c;
    }
    <span style="color:#66d9ef">inline</span> bign <span style="color:#66d9ef">operator</span> <span style="color:#f92672">+</span> (<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> b) <span style="color:#66d9ef">const</span>
    {
        <span style="color:#66d9ef">return</span> <span style="color:#f92672">*</span><span style="color:#66d9ef">this</span> <span style="color:#f92672">+</span> bign(b);
    }
    <span style="color:#66d9ef">inline</span> bign <span style="color:#66d9ef">operator</span> <span style="color:#f92672">-</span> (<span style="color:#66d9ef">const</span> bign <span style="color:#f92672">&amp;</span>b) <span style="color:#66d9ef">const</span>
    {
        bign c;
        c.length <span style="color:#f92672">=</span> length;
        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> length; i<span style="color:#f92672">++</span>)
        {
            c.val[i] <span style="color:#f92672">+=</span> val[i] <span style="color:#f92672">-</span> b.val[i];
            <span style="color:#66d9ef">if</span> (c.val[i] <span style="color:#f92672">&lt;</span> <span style="color:#ae81ff">0</span>)
            {
                c.val[i] <span style="color:#f92672">+=</span> <span style="color:#ae81ff">10</span>;
                c.val[i <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>]<span style="color:#f92672">--</span>;
            }
        }
        <span style="color:#66d9ef">while</span> (c.val[c.length <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>)
        {
            c.length<span style="color:#f92672">--</span>;
        }
        <span style="color:#66d9ef">return</span> c;
    }
    <span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">print</span>() <span style="color:#66d9ef">const</span>
    {
        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> length <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&gt;=</span> <span style="color:#ae81ff">0</span>; i<span style="color:#f92672">--</span>)
        {
            printf(<span style="color:#e6db74">&#34;%d&#34;</span>, val[i]);
        }
    }
};

<span style="color:#66d9ef">int</span> n;
bign f[MAXN];

<span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">long</span> <span style="color:#66d9ef">long</span> start_time_ <span style="color:#f92672">=</span> clock();
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;1002.in&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>, stdin);
    freopen(<span style="color:#e6db74">&#34;1002.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    scanf(<span style="color:#e6db74">&#34;%d&#34;</span>, <span style="color:#f92672">&amp;</span>n);
    f[<span style="color:#ae81ff">1</span>] <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
    f[<span style="color:#ae81ff">2</span>] <span style="color:#f92672">=</span> <span style="color:#ae81ff">5</span>;
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">3</span>; i <span style="color:#f92672">&lt;=</span> n; i<span style="color:#f92672">++</span>)
    {
        f[i] <span style="color:#f92672">=</span> f[i <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">*</span> <span style="color:#ae81ff">3</span> <span style="color:#f92672">-</span> f[i <span style="color:#f92672">-</span> <span style="color:#ae81ff">2</span>] <span style="color:#f92672">+</span> <span style="color:#ae81ff">2</span>;
    }
    f[n].print();
    <span style="color:#75715e">/*for (int i = 1; i &lt;= 100; i++)
</span><span style="color:#75715e">    {
</span><span style="color:#75715e">        printf(&#34;%d &#34;, i);
</span><span style="color:#75715e">        f[i].print();
</span><span style="color:#75715e">        printf(&#34;\n&#34;);
</span><span style="color:#75715e">    }*/</span>
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    printf(<span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">run time: %lld ms</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>, clock() <span style="color:#f92672">-</span> start_time_);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    fclose(stdin);
    fclose(stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
}
</code></pre></div><p>当然咯，N只有100，果断敲个TABLE刷RANK，只是内存懒得优化，排在超级后面。</p>]]></content></item><item><title>[BZOJ1056][HAOI2008]排名系统（SPLAY + TRIE / HASH）</title><link>https://www.sxn.dev/posts/haoi2008-rank/</link><pubDate>Thu, 15 May 2014 16:55:41 +0000</pubDate><guid>https://www.sxn.dev/posts/haoi2008-rank/</guid><description>&lt;p>只是一道平衡树水题，其实TREAP就可以了，只是有个操作我觉得还是SPLAY写起来舒服。一开始用的TRIE维护名字，后来又用HASH写了，稍微快了一点点。。&lt;/p></description><content type="html"><![CDATA[<p>只是一道平衡树水题，其实TREAP就可以了，只是有个操作我觉得还是SPLAY写起来舒服。一开始用的TRIE维护名字，后来又用HASH写了，稍微快了一点点。。</p>
<p>TRIE版：</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#75715e">//HAOI2008 rank.cpp
</span><span style="color:#75715e"></span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;algorithm&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;iostream&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstring&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdlib&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdio&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;string&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cmath&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;queue&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;stack&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;map&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span>
<span style="color:#75715e">//#define LOCAL
</span><span style="color:#75715e"></span><span style="color:#75715e">#define READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define READ_FILE
</span><span style="color:#75715e">//#define VISUAL_STUDIO
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL
</span><span style="color:#75715e">#define LOCAL_TIME
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define LOCAL_DEBUG
</span><span style="color:#75715e">//#define STD_DEBUG
</span><span style="color:#75715e"></span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXN <span style="color:#f92672">=</span> <span style="color:#ae81ff">250010</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXTRIE <span style="color:#f92672">=</span> <span style="color:#ae81ff">500000</span>;

<span style="color:#75715e">#ifdef VISUAL_STUDIO
</span><span style="color:#75715e">#pragma warning(disable: 4996)
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;ctime&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#66d9ef">char</span> fread_point;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">get_int</span>()
{
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">while</span> ((fread_point <span style="color:#f92672">&lt;</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">||</span> (fread_point <span style="color:#f92672">&gt;</span> <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        fread_point <span style="color:#f92672">=</span> getchar();
    }
    <span style="color:#66d9ef">while</span> ((fread_point <span style="color:#f92672">&gt;=</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (fread_point <span style="color:#f92672">&lt;=</span> <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        ret <span style="color:#f92672">=</span> ret <span style="color:#f92672">*</span> <span style="color:#ae81ff">10</span> <span style="color:#f92672">+</span> fread_point <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;0&#39;</span>;
        fread_point <span style="color:#f92672">=</span> getchar();
    }
    <span style="color:#66d9ef">return</span> ret;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">char</span> <span style="color:#a6e22e">get_char</span>()
{
    <span style="color:#66d9ef">while</span> ((fread_point <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39; &#39;</span>) <span style="color:#f92672">||</span> (fread_point <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;n&#39;</span>))
    {
        fread_point <span style="color:#f92672">=</span> getchar();
    }
    <span style="color:#66d9ef">char</span> ret <span style="color:#f92672">=</span> fread_point;
    fread_point <span style="color:#f92672">=</span> getchar();
    <span style="color:#66d9ef">return</span> ret;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">get_string</span>(<span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>input)
{
    memset(input, <span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">12</span>);
    <span style="color:#66d9ef">while</span> ((fread_point <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39; &#39;</span>) <span style="color:#f92672">||</span> (fread_point <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;n&#39;</span>))
    {
        fread_point <span style="color:#f92672">=</span> getchar();
    }
    <span style="color:#66d9ef">int</span> loop <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">while</span> ((fread_point <span style="color:#f92672">!=</span> <span style="color:#e6db74">&#39; &#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (fread_point <span style="color:#f92672">!=</span> <span style="color:#e6db74">&#39;n&#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (fread_point <span style="color:#f92672">!=</span> EOF))
    {
        input[loop<span style="color:#f92672">++</span>] <span style="color:#f92672">=</span> fread_point;
        fread_point <span style="color:#f92672">=</span> getchar();
    }
}
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">read</span>(<span style="color:#66d9ef">int</span> <span style="color:#f92672">&amp;</span>a)
{
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>    a <span style="color:#f92672">=</span> get_int();
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>    scanf(<span style="color:#e6db74">&#34;%d&#34;</span>, <span style="color:#f92672">&amp;</span>a);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">read</span>(<span style="color:#66d9ef">char</span> <span style="color:#f92672">&amp;</span>a)
{
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>    a <span style="color:#f92672">=</span> get_char();
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>    scanf(<span style="color:#e6db74">&#34;%c&#34;</span>, <span style="color:#f92672">&amp;</span>a);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">read</span>(<span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>a)
{
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>    get_string(a);
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>    scanf(<span style="color:#e6db74">&#34;%s&#34;</span>, a);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#66d9ef">typedef</span> <span style="color:#66d9ef">long</span> <span style="color:#66d9ef">long</span> ll;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">string_to_int</span>(<span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>a)
{
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; a[i] <span style="color:#f92672">!=</span> <span style="color:#ae81ff">0</span>; i<span style="color:#f92672">++</span>)
    {
        ret <span style="color:#f92672">=</span> ret <span style="color:#f92672">*</span> <span style="color:#ae81ff">10</span> <span style="color:#f92672">+</span> a[i] <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;0&#39;</span>;
    }
    <span style="color:#66d9ef">return</span> ret;
}

<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">splay_node</span>
{
    <span style="color:#66d9ef">int</span> val;
    <span style="color:#66d9ef">char</span> name[<span style="color:#ae81ff">12</span>];
    splay_node <span style="color:#f92672">*</span>parent, <span style="color:#f92672">*</span>l_child, <span style="color:#f92672">*</span>r_child;
    <span style="color:#66d9ef">int</span> size;
    <span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">init</span>()
    {
        parent <span style="color:#f92672">=</span> l_child <span style="color:#f92672">=</span> r_child <span style="color:#f92672">=</span> NULL;
        size <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
        <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">this</span>;
    }
};

splay_node recover_splay[MAXN];
splay_node <span style="color:#f92672">*</span>stack_splay[MAXN];
<span style="color:#66d9ef">int</span> top_stack_splay <span style="color:#f92672">=</span> MAXN;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">init_splay</span>()
{
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> MAXN; i<span style="color:#f92672">++</span>)
    {
        stack_splay[i] <span style="color:#f92672">=</span> recover_splay <span style="color:#f92672">+</span> i;
    }
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">new_node</span>()
{
    <span style="color:#66d9ef">return</span> stack_splay[<span style="color:#f92672">--</span>top_stack_splay]<span style="color:#f92672">-&gt;</span>init();
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">delete_node</span>(splay_node <span style="color:#f92672">*</span>del_node)
{
    stack_splay[top_stack_splay<span style="color:#f92672">++</span>] <span style="color:#f92672">=</span> del_node;
}

splay_node <span style="color:#f92672">*</span>head_splay;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">splay_size</span>(splay_node <span style="color:#f92672">*</span>query_node)
{
    <span style="color:#66d9ef">if</span> (query_node <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
    }
    <span style="color:#66d9ef">return</span> query_node<span style="color:#f92672">-&gt;</span>size;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">attach_as_l_child</span>(splay_node <span style="color:#f92672">*</span>parent, splay_node <span style="color:#f92672">*</span>child)
{
    parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> child;
    <span style="color:#66d9ef">if</span> (child <span style="color:#f92672">!=</span> NULL)
    {
        child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">attach_as_r_child</span>(splay_node <span style="color:#f92672">*</span>parent, splay_node <span style="color:#f92672">*</span>child)
{
    parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> child;
    <span style="color:#66d9ef">if</span> (child <span style="color:#f92672">!=</span> NULL)
    {
        child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zig</span>(splay_node <span style="color:#f92672">*</span>axis)
{
    splay_node <span style="color:#f92672">*</span>left_child <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>l_child;
    splay_node <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>parent;
    attach_as_l_child(axis, left_child<span style="color:#f92672">-&gt;</span>r_child);
    attach_as_r_child(left_child, axis);
    left_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    <span style="color:#66d9ef">if</span> (parent <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> axis)
        {
            parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> left_child;
        }
        <span style="color:#66d9ef">else</span>
        {
            parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> left_child;
        }
    }
    left_child<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>size;
    axis<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> splay_size(axis<span style="color:#f92672">-&gt;</span>l_child) <span style="color:#f92672">+</span> splay_size(axis<span style="color:#f92672">-&gt;</span>r_child) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zag</span>(splay_node <span style="color:#f92672">*</span>axis)
{
    splay_node <span style="color:#f92672">*</span>right_child <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>r_child;
    splay_node <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>parent;
    attach_as_r_child(axis, right_child<span style="color:#f92672">-&gt;</span>l_child);
    attach_as_l_child(right_child, axis);
    right_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    <span style="color:#66d9ef">if</span> (parent <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> axis)
        {
            parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> right_child;
        }
        <span style="color:#66d9ef">else</span>
        {
            parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> right_child;
        }
    }
    right_child<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>size;
    axis<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> splay_size(axis<span style="color:#f92672">-&gt;</span>l_child) <span style="color:#f92672">+</span> splay_size(axis<span style="color:#f92672">-&gt;</span>r_child) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_route</span>(splay_node <span style="color:#f92672">*</span>v)
{
    splay_node <span style="color:#f92672">*</span>parent, <span style="color:#f92672">*</span>grand_parent;
    <span style="color:#66d9ef">while</span> (((parent <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>parent) <span style="color:#f92672">!=</span> NULL) <span style="color:#f92672">&amp;&amp;</span> ((grand_parent <span style="color:#f92672">=</span> parent<span style="color:#f92672">-&gt;</span>parent) <span style="color:#f92672">!=</span> NULL))
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> v)
        {
            <span style="color:#66d9ef">if</span> (grand_parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> parent)
            {
                zig(grand_parent);
                zig(parent);
            }
            <span style="color:#66d9ef">else</span>
            {
                zig(parent);
                zag(grand_parent);
            }
        }
        <span style="color:#66d9ef">else</span>
        {
            <span style="color:#66d9ef">if</span> (grand_parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">==</span> parent)
            {
                zag(grand_parent);
                zag(parent);
            }
            <span style="color:#66d9ef">else</span>
            {
                zag(parent);
                zig(grand_parent);
            }
        }
    }
    <span style="color:#66d9ef">if</span> ((parent <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>parent) <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> v)
        {
            zig(parent);
        }
        <span style="color:#66d9ef">else</span>
        {
            zag(parent);
        }
    }
    <span style="color:#66d9ef">return</span> v;
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_find</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> add_size <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>)
{
    splay_node <span style="color:#f92672">*</span>last_visit <span style="color:#f92672">=</span> NULL;
    <span style="color:#66d9ef">for</span> (splay_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> head_splay; tmp <span style="color:#f92672">!=</span> NULL;)
    {
        last_visit <span style="color:#f92672">=</span> tmp;
        tmp<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">+=</span> add_size;
        <span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">&gt;=</span> val)
        {
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>r_child;
        }
        <span style="color:#66d9ef">else</span>
        {
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>l_child;
        }
    }
    <span style="color:#66d9ef">return</span> last_visit;
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_find_by_rank</span>(splay_node <span style="color:#f92672">*</span>v, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> k)
{
    <span style="color:#66d9ef">int</span> rank <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">int</span> left_size;
    <span style="color:#66d9ef">while</span> (v <span style="color:#f92672">!=</span> NULL)
    {
        left_size <span style="color:#f92672">=</span> splay_size(v<span style="color:#f92672">-&gt;</span>l_child) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
        <span style="color:#66d9ef">if</span> (rank <span style="color:#f92672">+</span> left_size <span style="color:#f92672">==</span> k)
        {
            <span style="color:#66d9ef">return</span> v;
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (rank <span style="color:#f92672">+</span> left_size <span style="color:#f92672">&gt;</span> k)
        {
            v <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>l_child;
        }
        <span style="color:#66d9ef">else</span>
        {
            rank <span style="color:#f92672">+=</span> left_size;
            v <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>r_child;
        }
    }
    <span style="color:#66d9ef">return</span> NULL;
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_last</span>(splay_node <span style="color:#f92672">*</span>v)
{
    <span style="color:#66d9ef">while</span> (v<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL)
    {
        v <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>r_child;
    }
    <span style="color:#66d9ef">return</span> v;
}

<span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_print</span>(splay_node <span style="color:#f92672">*</span>root)
{
    <span style="color:#66d9ef">if</span> (root <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span>;
    }
    splay_print(root<span style="color:#f92672">-&gt;</span>l_child);
    printf(<span style="color:#e6db74">&#34; %s&#34;</span>, root<span style="color:#f92672">-&gt;</span>name);
    splay_print(root<span style="color:#f92672">-&gt;</span>r_child);
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_insert</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val, <span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>name, splay_node <span style="color:#f92672">*</span>new_pt <span style="color:#f92672">=</span> NULL)
{
    <span style="color:#66d9ef">if</span> (new_pt <span style="color:#f92672">==</span> NULL)
    {
        new_pt <span style="color:#f92672">=</span> new_node();
        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> <span style="color:#ae81ff">10</span>; i<span style="color:#f92672">++</span>)
        {
            new_pt<span style="color:#f92672">-&gt;</span>name[i] <span style="color:#f92672">=</span> name[i];
        }
    }
    <span style="color:#66d9ef">else</span>
    {
        new_pt<span style="color:#f92672">-&gt;</span>init();
    }
    new_pt<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">=</span> val;
    <span style="color:#66d9ef">if</span> (head_splay <span style="color:#f92672">==</span> NULL)
    {
        head_splay <span style="color:#f92672">=</span> new_pt;
    }
    <span style="color:#66d9ef">else</span>
    {
        splay_node <span style="color:#f92672">*</span>insert_pt <span style="color:#f92672">=</span> splay_find(val, <span style="color:#ae81ff">1</span>);
        <span style="color:#66d9ef">if</span> (insert_pt<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">&gt;=</span> val)
        {
            attach_as_r_child(insert_pt, new_pt);
        }
        <span style="color:#66d9ef">else</span>
        {
            attach_as_l_child(insert_pt, new_pt);
        }
        head_splay <span style="color:#f92672">=</span> splay_route(new_pt);
    }
    <span style="color:#66d9ef">return</span> new_pt;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_delete</span>(splay_node <span style="color:#f92672">*</span>del_node)
{
    splay_route(del_node);
    <span style="color:#66d9ef">if</span> (del_node<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL)
    {
        del_node<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> NULL;
    }
    <span style="color:#66d9ef">if</span> (del_node<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL)
    {
        del_node<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> NULL;
    }
    <span style="color:#66d9ef">if</span> (del_node<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> NULL)
    {
        head_splay <span style="color:#f92672">=</span> del_node<span style="color:#f92672">-&gt;</span>r_child;
    }
    <span style="color:#66d9ef">else</span>
    {
        head_splay <span style="color:#f92672">=</span> splay_route(splay_last(del_node<span style="color:#f92672">-&gt;</span>l_child));
        attach_as_r_child(head_splay, del_node<span style="color:#f92672">-&gt;</span>r_child);
        head_splay<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">+=</span> splay_size(del_node<span style="color:#f92672">-&gt;</span>r_child);
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_change</span>(splay_node <span style="color:#f92672">*</span>change_node, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
    splay_delete(change_node);
    splay_insert(val, NULL, change_node);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_query_users</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> k)
{
    head_splay <span style="color:#f92672">=</span> splay_route(splay_find_by_rank(head_splay, k));
    printf(<span style="color:#e6db74">&#34;%s&#34;</span>, head_splay<span style="color:#f92672">-&gt;</span>name);
    <span style="color:#66d9ef">if</span> (splay_size(head_splay<span style="color:#f92672">-&gt;</span>r_child) <span style="color:#f92672">&lt;=</span> <span style="color:#ae81ff">9</span>)
    {
        splay_print(head_splay<span style="color:#f92672">-&gt;</span>r_child);
    }
    <span style="color:#66d9ef">else</span>
    {
        head_splay<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> NULL;
        attach_as_r_child(head_splay, splay_route(splay_find_by_rank(head_splay<span style="color:#f92672">-&gt;</span>r_child, <span style="color:#ae81ff">10</span>)));
        splay_print(head_splay<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>l_child);
    }
    printf(<span style="color:#e6db74">&#34;n&#34;</span>);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">splay_query_rank</span>(splay_node <span style="color:#f92672">*</span>v)
{
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> splay_size(v<span style="color:#f92672">-&gt;</span>l_child) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
    <span style="color:#66d9ef">while</span> (v<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (v<span style="color:#f92672">-&gt;</span>parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">==</span> v)
        {
            ret <span style="color:#f92672">+=</span> splay_size(v<span style="color:#f92672">-&gt;</span>parent<span style="color:#f92672">-&gt;</span>l_child) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
        }
        v <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>parent;
    }
    <span style="color:#66d9ef">return</span> ret;
}

<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">trie_node</span>
{
    trie_node <span style="color:#f92672">*</span>next[<span style="color:#ae81ff">26</span>];
    splay_node <span style="color:#f92672">*</span>val;
    <span style="color:#66d9ef">inline</span> trie_node <span style="color:#f92672">*</span><span style="color:#a6e22e">init</span>()
    {
        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> <span style="color:#ae81ff">26</span>; i<span style="color:#f92672">++</span>)
        {
            next[i] <span style="color:#f92672">=</span> NULL;
        }
        val <span style="color:#f92672">=</span> NULL;
        <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">this</span>;
    }
};

trie_node recover_trie[MAXTRIE];
trie_node <span style="color:#f92672">*</span>stack_trie[MAXTRIE];
<span style="color:#66d9ef">int</span> top_stack_trie <span style="color:#f92672">=</span> MAXTRIE;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">init_trie</span>()
{
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> MAXTRIE; i<span style="color:#f92672">++</span>)
    {
        stack_trie[i] <span style="color:#f92672">=</span> recover_trie <span style="color:#f92672">+</span> i;
    }
}

<span style="color:#66d9ef">inline</span> trie_node <span style="color:#f92672">*</span><span style="color:#a6e22e">new_trie</span>()
{
    <span style="color:#66d9ef">return</span> stack_trie[<span style="color:#f92672">--</span>top_stack_trie]<span style="color:#f92672">-&gt;</span>init();
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">delete_trie</span>(trie_node <span style="color:#f92672">*</span>del_node)
{
    stack_trie[top_stack_trie<span style="color:#f92672">++</span>] <span style="color:#f92672">=</span> del_node;
}

trie_node <span style="color:#f92672">*</span>head_trie;

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">trie_find</span>(<span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>find_string)
{
    trie_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> head_trie;
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; find_string[i] <span style="color:#f92672">!=</span> <span style="color:#ae81ff">0</span>; i<span style="color:#f92672">++</span>)
    {
        <span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>next[find_string[i] <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;A&#39;</span>] <span style="color:#f92672">==</span> NULL)
        {
            <span style="color:#66d9ef">return</span> NULL;
        }
        <span style="color:#66d9ef">else</span>
        {
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>next[find_string[i] <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;A&#39;</span>];
        }
    }
    <span style="color:#66d9ef">return</span> tmp<span style="color:#f92672">-&gt;</span>val;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">trie_insert</span>(<span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>insert_string, splay_node <span style="color:#f92672">*</span>val)
{
    trie_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> head_trie;
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; insert_string[i] <span style="color:#f92672">!=</span> <span style="color:#ae81ff">0</span>; i<span style="color:#f92672">++</span>)
    {
        <span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>next[insert_string[i] <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;A&#39;</span>] <span style="color:#f92672">==</span> NULL)
        {
            tmp<span style="color:#f92672">-&gt;</span>next[insert_string[i] <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;A&#39;</span>] <span style="color:#f92672">=</span> new_trie();
        }
        tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>next[insert_string[i] <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;A&#39;</span>];
    }
    tmp<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">=</span> val;
}

<span style="color:#66d9ef">int</span> n;
<span style="color:#66d9ef">char</span> op_char;
<span style="color:#66d9ef">char</span> op_name[<span style="color:#ae81ff">12</span>];
<span style="color:#66d9ef">int</span> k;
splay_node <span style="color:#f92672">*</span>found;

<span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    ll start_time_ <span style="color:#f92672">=</span> clock();
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;rank.in&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>, stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;rank.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    fread_point <span style="color:#f92672">=</span> getchar();
    read(n);
    init_splay();
    init_trie();
    head_trie <span style="color:#f92672">=</span> new_trie();
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> n; i<span style="color:#f92672">++</span>)
    {
        read(op_char);
        read(op_name);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>        printf(<span style="color:#e6db74">&#34;%d %c %s &#34;</span>, i, op_char, op_name);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>        <span style="color:#66d9ef">if</span> (op_char <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;+&#39;</span>)
        {
            read(k);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, k);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>            <span style="color:#66d9ef">if</span> ((found <span style="color:#f92672">=</span> trie_find(op_name)) <span style="color:#f92672">!=</span> NULL)
            {
                splay_change(found, k);
            }
            <span style="color:#66d9ef">else</span>
            {
                trie_insert(op_name, splay_insert(k, op_name));
            }
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (op_char <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;?&#39;</span>)
        {
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;n&#34;</span>);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>            <span style="color:#66d9ef">if</span> ((op_name[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">&gt;=</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (op_name[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">&lt;=</span> <span style="color:#e6db74">&#39;9&#39;</span>))
            {
                k <span style="color:#f92672">=</span> string_to_int(op_name);
                splay_query_users(k);
            }
            <span style="color:#66d9ef">else</span>
            {
                printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, splay_query_rank(trie_find(op_name)));
            }
        }
    }
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    printf(<span style="color:#e6db74">&#34;run time: %lld msn&#34;</span>, clock() <span style="color:#f92672">-</span> start_time_);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    fclose(stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>    fclose(stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
}
</code></pre></div><p>HASH版：</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#f92672">**************************************************************</span>
    Problem: <span style="color:#ae81ff">1056</span>
    User: shenxn
    Language: C<span style="color:#f92672">++</span>
    Result: Accepted
    Time:<span style="color:#ae81ff">1276</span> ms
    Memory:<span style="color:#ae81ff">16320</span> kb
<span style="color:#f92672">***************************************************************</span><span style="color:#960050;background-color:#1e0010">*/</span>

<span style="color:#75715e">//HAOI2008 rank.cpp
</span><span style="color:#75715e"></span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;algorithm&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;iostream&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstring&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdlib&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdio&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;string&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cmath&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;queue&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;stack&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;map&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span>
<span style="color:#75715e">//#define LOCAL
</span><span style="color:#75715e"></span><span style="color:#75715e">#define READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define READ_FILE
</span><span style="color:#75715e">//#define VISUAL_STUDIO
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL
</span><span style="color:#75715e">#define LOCAL_TIME
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define LOCAL_DEBUG
</span><span style="color:#75715e">//#define STD_DEBUG
</span><span style="color:#75715e"></span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXN <span style="color:#f92672">=</span> <span style="color:#ae81ff">250010</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXTRIE <span style="color:#f92672">=</span> <span style="color:#ae81ff">500000</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXHASH <span style="color:#f92672">=</span> <span style="color:#ae81ff">250000</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXHASHLIST <span style="color:#f92672">=</span> <span style="color:#ae81ff">100000</span>;

<span style="color:#75715e">#ifdef VISUAL_STUDIO
</span><span style="color:#75715e">#pragma warning(disable: 4996)
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;ctime&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#66d9ef">char</span> fread_point;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">get_int</span>()
{
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">while</span> ((fread_point <span style="color:#f92672">&lt;</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">||</span> (fread_point <span style="color:#f92672">&gt;</span> <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        fread_point <span style="color:#f92672">=</span> getchar();
    }
    <span style="color:#66d9ef">while</span> ((fread_point <span style="color:#f92672">&gt;=</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (fread_point <span style="color:#f92672">&lt;=</span> <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        ret <span style="color:#f92672">=</span> ret <span style="color:#f92672">*</span> <span style="color:#ae81ff">10</span> <span style="color:#f92672">+</span> fread_point <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;0&#39;</span>;
        fread_point <span style="color:#f92672">=</span> getchar();
    }
    <span style="color:#66d9ef">return</span> ret;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">char</span> <span style="color:#a6e22e">get_char</span>()
{
    <span style="color:#66d9ef">while</span> ((fread_point <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39; &#39;</span>) <span style="color:#f92672">||</span> (fread_point <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;n&#39;</span>))
    {
        fread_point <span style="color:#f92672">=</span> getchar();
    }
    <span style="color:#66d9ef">char</span> ret <span style="color:#f92672">=</span> fread_point;
    fread_point <span style="color:#f92672">=</span> getchar();
    <span style="color:#66d9ef">return</span> ret;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">get_string</span>(<span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>input)
{
    memset(input, <span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">12</span>);
    <span style="color:#66d9ef">while</span> ((fread_point <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39; &#39;</span>) <span style="color:#f92672">||</span> (fread_point <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;n&#39;</span>))
    {
        fread_point <span style="color:#f92672">=</span> getchar();
    }
    <span style="color:#66d9ef">int</span> loop <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">while</span> ((fread_point <span style="color:#f92672">!=</span> <span style="color:#e6db74">&#39; &#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (fread_point <span style="color:#f92672">!=</span> <span style="color:#e6db74">&#39;n&#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (fread_point <span style="color:#f92672">!=</span> EOF))
    {
        input[loop<span style="color:#f92672">++</span>] <span style="color:#f92672">=</span> fread_point;
        fread_point <span style="color:#f92672">=</span> getchar();
    }
}
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">read</span>(<span style="color:#66d9ef">int</span> <span style="color:#f92672">&amp;</span>a)
{
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>    a <span style="color:#f92672">=</span> get_int();
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>    scanf(<span style="color:#e6db74">&#34;%d&#34;</span>, <span style="color:#f92672">&amp;</span>a);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">read</span>(<span style="color:#66d9ef">char</span> <span style="color:#f92672">&amp;</span>a)
{
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>    a <span style="color:#f92672">=</span> get_char();
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>    scanf(<span style="color:#e6db74">&#34;%c&#34;</span>, <span style="color:#f92672">&amp;</span>a);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">read</span>(<span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>a)
{
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>    get_string(a);
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>    scanf(<span style="color:#e6db74">&#34;%s&#34;</span>, a);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#66d9ef">typedef</span> <span style="color:#66d9ef">long</span> <span style="color:#66d9ef">long</span> ll;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">string_to_int</span>(<span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>a)
{
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; a[i] <span style="color:#f92672">!=</span> <span style="color:#ae81ff">0</span>; i<span style="color:#f92672">++</span>)
    {
        ret <span style="color:#f92672">=</span> ret <span style="color:#f92672">*</span> <span style="color:#ae81ff">10</span> <span style="color:#f92672">+</span> a[i] <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;0&#39;</span>;
    }
    <span style="color:#66d9ef">return</span> ret;
}

<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">splay_node</span>
{
    <span style="color:#66d9ef">int</span> val;
    <span style="color:#66d9ef">char</span> name[<span style="color:#ae81ff">12</span>];
    splay_node <span style="color:#f92672">*</span>parent, <span style="color:#f92672">*</span>l_child, <span style="color:#f92672">*</span>r_child;
    <span style="color:#66d9ef">int</span> size;
    <span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">init</span>()
    {
        parent <span style="color:#f92672">=</span> l_child <span style="color:#f92672">=</span> r_child <span style="color:#f92672">=</span> NULL;
        size <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
        <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">this</span>;
    }
};

splay_node recover_splay[MAXN];
splay_node <span style="color:#f92672">*</span>stack_splay[MAXN];
<span style="color:#66d9ef">int</span> top_stack_splay <span style="color:#f92672">=</span> MAXN;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">init_splay</span>()
{
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> MAXN; i<span style="color:#f92672">++</span>)
    {
        stack_splay[i] <span style="color:#f92672">=</span> recover_splay <span style="color:#f92672">+</span> i;
    }
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">new_node</span>()
{
    <span style="color:#66d9ef">return</span> stack_splay[<span style="color:#f92672">--</span>top_stack_splay]<span style="color:#f92672">-&gt;</span>init();
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">delete_node</span>(splay_node <span style="color:#f92672">*</span>del_node)
{
    stack_splay[top_stack_splay<span style="color:#f92672">++</span>] <span style="color:#f92672">=</span> del_node;
}

splay_node <span style="color:#f92672">*</span>head_splay;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">splay_size</span>(splay_node <span style="color:#f92672">*</span>query_node)
{
    <span style="color:#66d9ef">if</span> (query_node <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
    }
    <span style="color:#66d9ef">return</span> query_node<span style="color:#f92672">-&gt;</span>size;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">attach_as_l_child</span>(splay_node <span style="color:#f92672">*</span>parent, splay_node <span style="color:#f92672">*</span>child)
{
    parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> child;
    <span style="color:#66d9ef">if</span> (child <span style="color:#f92672">!=</span> NULL)
    {
        child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">attach_as_r_child</span>(splay_node <span style="color:#f92672">*</span>parent, splay_node <span style="color:#f92672">*</span>child)
{
    parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> child;
    <span style="color:#66d9ef">if</span> (child <span style="color:#f92672">!=</span> NULL)
    {
        child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zig</span>(splay_node <span style="color:#f92672">*</span>axis)
{
    splay_node <span style="color:#f92672">*</span>left_child <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>l_child;
    splay_node <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>parent;
    attach_as_l_child(axis, left_child<span style="color:#f92672">-&gt;</span>r_child);
    attach_as_r_child(left_child, axis);
    left_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    <span style="color:#66d9ef">if</span> (parent <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> axis)
        {
            parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> left_child;
        }
        <span style="color:#66d9ef">else</span>
        {
            parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> left_child;
        }
    }
    left_child<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>size;
    axis<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> splay_size(axis<span style="color:#f92672">-&gt;</span>l_child) <span style="color:#f92672">+</span> splay_size(axis<span style="color:#f92672">-&gt;</span>r_child) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zag</span>(splay_node <span style="color:#f92672">*</span>axis)
{
    splay_node <span style="color:#f92672">*</span>right_child <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>r_child;
    splay_node <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>parent;
    attach_as_r_child(axis, right_child<span style="color:#f92672">-&gt;</span>l_child);
    attach_as_l_child(right_child, axis);
    right_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    <span style="color:#66d9ef">if</span> (parent <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> axis)
        {
            parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> right_child;
        }
        <span style="color:#66d9ef">else</span>
        {
            parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> right_child;
        }
    }
    right_child<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>size;
    axis<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> splay_size(axis<span style="color:#f92672">-&gt;</span>l_child) <span style="color:#f92672">+</span> splay_size(axis<span style="color:#f92672">-&gt;</span>r_child) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_route</span>(splay_node <span style="color:#f92672">*</span>v)
{
    splay_node <span style="color:#f92672">*</span>parent, <span style="color:#f92672">*</span>grand_parent;
    <span style="color:#66d9ef">while</span> (((parent <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>parent) <span style="color:#f92672">!=</span> NULL) <span style="color:#f92672">&amp;&amp;</span> ((grand_parent <span style="color:#f92672">=</span> parent<span style="color:#f92672">-&gt;</span>parent) <span style="color:#f92672">!=</span> NULL))
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> v)
        {
            <span style="color:#66d9ef">if</span> (grand_parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> parent)
            {
                zig(grand_parent);
                zig(parent);
            }
            <span style="color:#66d9ef">else</span>
            {
                zig(parent);
                zag(grand_parent);
            }
        }
        <span style="color:#66d9ef">else</span>
        {
            <span style="color:#66d9ef">if</span> (grand_parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">==</span> parent)
            {
                zag(grand_parent);
                zag(parent);
            }
            <span style="color:#66d9ef">else</span>
            {
                zag(parent);
                zig(grand_parent);
            }
        }
    }
    <span style="color:#66d9ef">if</span> ((parent <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>parent) <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> v)
        {
            zig(parent);
        }
        <span style="color:#66d9ef">else</span>
        {
            zag(parent);
        }
    }
    <span style="color:#66d9ef">return</span> v;
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_find</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> add_size <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>)
{
    splay_node <span style="color:#f92672">*</span>last_visit <span style="color:#f92672">=</span> NULL;
    <span style="color:#66d9ef">for</span> (splay_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> head_splay; tmp <span style="color:#f92672">!=</span> NULL;)
    {
        last_visit <span style="color:#f92672">=</span> tmp;
        tmp<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">+=</span> add_size;
        <span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">&gt;=</span> val)
        {
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>r_child;
        }
        <span style="color:#66d9ef">else</span>
        {
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>l_child;
        }
    }
    <span style="color:#66d9ef">return</span> last_visit;
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_find_by_rank</span>(splay_node <span style="color:#f92672">*</span>v, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> k)
{
    <span style="color:#66d9ef">int</span> rank <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">int</span> left_size;
    <span style="color:#66d9ef">while</span> (v <span style="color:#f92672">!=</span> NULL)
    {
        left_size <span style="color:#f92672">=</span> splay_size(v<span style="color:#f92672">-&gt;</span>l_child) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
        <span style="color:#66d9ef">if</span> (rank <span style="color:#f92672">+</span> left_size <span style="color:#f92672">==</span> k)
        {
            <span style="color:#66d9ef">return</span> v;
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (rank <span style="color:#f92672">+</span> left_size <span style="color:#f92672">&gt;</span> k)
        {
            v <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>l_child;
        }
        <span style="color:#66d9ef">else</span>
        {
            rank <span style="color:#f92672">+=</span> left_size;
            v <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>r_child;
        }
    }
    <span style="color:#66d9ef">return</span> NULL;
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_last</span>(splay_node <span style="color:#f92672">*</span>v)
{
    <span style="color:#66d9ef">while</span> (v<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL)
    {
        v <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>r_child;
    }
    <span style="color:#66d9ef">return</span> v;
}

<span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_print</span>(splay_node <span style="color:#f92672">*</span>root)
{
    <span style="color:#66d9ef">if</span> (root <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span>;
    }
    splay_print(root<span style="color:#f92672">-&gt;</span>l_child);
    printf(<span style="color:#e6db74">&#34; %s&#34;</span>, root<span style="color:#f92672">-&gt;</span>name);
    splay_print(root<span style="color:#f92672">-&gt;</span>r_child);
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_insert</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val, <span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>name, splay_node <span style="color:#f92672">*</span>new_pt <span style="color:#f92672">=</span> NULL)
{
    <span style="color:#66d9ef">if</span> (new_pt <span style="color:#f92672">==</span> NULL)
    {
        new_pt <span style="color:#f92672">=</span> new_node();
        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> <span style="color:#ae81ff">10</span>; i<span style="color:#f92672">++</span>)
        {
            new_pt<span style="color:#f92672">-&gt;</span>name[i] <span style="color:#f92672">=</span> name[i];
        }
    }
    <span style="color:#66d9ef">else</span>
    {
        new_pt<span style="color:#f92672">-&gt;</span>init();
    }
    new_pt<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">=</span> val;
    <span style="color:#66d9ef">if</span> (head_splay <span style="color:#f92672">==</span> NULL)
    {
        head_splay <span style="color:#f92672">=</span> new_pt;
    }
    <span style="color:#66d9ef">else</span>
    {
        splay_node <span style="color:#f92672">*</span>insert_pt <span style="color:#f92672">=</span> splay_find(val, <span style="color:#ae81ff">1</span>);
        <span style="color:#66d9ef">if</span> (insert_pt<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">&gt;=</span> val)
        {
            attach_as_r_child(insert_pt, new_pt);
        }
        <span style="color:#66d9ef">else</span>
        {
            attach_as_l_child(insert_pt, new_pt);
        }
        head_splay <span style="color:#f92672">=</span> splay_route(new_pt);
    }
    <span style="color:#66d9ef">return</span> new_pt;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_delete</span>(splay_node <span style="color:#f92672">*</span>del_node)
{
    splay_route(del_node);
    <span style="color:#66d9ef">if</span> (del_node<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL)
    {
        del_node<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> NULL;
    }
    <span style="color:#66d9ef">if</span> (del_node<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL)
    {
        del_node<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> NULL;
    }
    <span style="color:#66d9ef">if</span> (del_node<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> NULL)
    {
        head_splay <span style="color:#f92672">=</span> del_node<span style="color:#f92672">-&gt;</span>r_child;
    }
    <span style="color:#66d9ef">else</span>
    {
        head_splay <span style="color:#f92672">=</span> splay_route(splay_last(del_node<span style="color:#f92672">-&gt;</span>l_child));
        attach_as_r_child(head_splay, del_node<span style="color:#f92672">-&gt;</span>r_child);
        head_splay<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">+=</span> splay_size(del_node<span style="color:#f92672">-&gt;</span>r_child);
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_change</span>(splay_node <span style="color:#f92672">*</span>change_node, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
    splay_delete(change_node);
    splay_insert(val, NULL, change_node);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_query_users</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> k)
{
    head_splay <span style="color:#f92672">=</span> splay_route(splay_find_by_rank(head_splay, k));
    printf(<span style="color:#e6db74">&#34;%s&#34;</span>, head_splay<span style="color:#f92672">-&gt;</span>name);
    <span style="color:#66d9ef">if</span> (splay_size(head_splay<span style="color:#f92672">-&gt;</span>r_child) <span style="color:#f92672">&lt;=</span> <span style="color:#ae81ff">9</span>)
    {
        splay_print(head_splay<span style="color:#f92672">-&gt;</span>r_child);
    }
    <span style="color:#66d9ef">else</span>
    {
        head_splay<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> NULL;
        attach_as_r_child(head_splay, splay_route(splay_find_by_rank(head_splay<span style="color:#f92672">-&gt;</span>r_child, <span style="color:#ae81ff">10</span>)));
        splay_print(head_splay<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>l_child);
    }
    printf(<span style="color:#e6db74">&#34;n&#34;</span>);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">splay_query_rank</span>(splay_node <span style="color:#f92672">*</span>v)
{
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> splay_size(v<span style="color:#f92672">-&gt;</span>l_child) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
    <span style="color:#66d9ef">while</span> (v<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (v<span style="color:#f92672">-&gt;</span>parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">==</span> v)
        {
            ret <span style="color:#f92672">+=</span> splay_size(v<span style="color:#f92672">-&gt;</span>parent<span style="color:#f92672">-&gt;</span>l_child) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
        }
        v <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>parent;
    }
    <span style="color:#66d9ef">return</span> ret;
}

<span style="color:#75715e">/*
</span><span style="color:#75715e">struct trie_node
</span><span style="color:#75715e">{
</span><span style="color:#75715e">    trie_node *next[26];
</span><span style="color:#75715e">    splay_node *val;
</span><span style="color:#75715e">    inline trie_node *init()
</span><span style="color:#75715e">    {
</span><span style="color:#75715e">        for (int i = 0; i &lt; 26; i++)
</span><span style="color:#75715e">        {
</span><span style="color:#75715e">            next[i] = NULL;
</span><span style="color:#75715e">        }
</span><span style="color:#75715e">        val = NULL;
</span><span style="color:#75715e">        return this;
</span><span style="color:#75715e">    }
</span><span style="color:#75715e">};
</span><span style="color:#75715e">
</span><span style="color:#75715e">trie_node recover_trie[MAXTRIE];
</span><span style="color:#75715e">trie_node *stack_trie[MAXTRIE];
</span><span style="color:#75715e">int top_stack_trie = MAXTRIE;
</span><span style="color:#75715e">
</span><span style="color:#75715e">inline void init_trie()
</span><span style="color:#75715e">{
</span><span style="color:#75715e">    for (int i = 0; i &lt; MAXTRIE; i++)
</span><span style="color:#75715e">    {
</span><span style="color:#75715e">        stack_trie[i] = recover_trie + i;
</span><span style="color:#75715e">    }
</span><span style="color:#75715e">}
</span><span style="color:#75715e">
</span><span style="color:#75715e">inline trie_node *new_trie()
</span><span style="color:#75715e">{
</span><span style="color:#75715e">    return stack_trie[--top_stack_trie]-&gt;init();
</span><span style="color:#75715e">}
</span><span style="color:#75715e">
</span><span style="color:#75715e">inline void delete_trie(trie_node *del_node)
</span><span style="color:#75715e">{
</span><span style="color:#75715e">    stack_trie[top_stack_trie++] = del_node;
</span><span style="color:#75715e">}
</span><span style="color:#75715e">
</span><span style="color:#75715e">trie_node *head_trie;
</span><span style="color:#75715e">
</span><span style="color:#75715e">inline splay_node *trie_find(char *find_string)
</span><span style="color:#75715e">{
</span><span style="color:#75715e">    trie_node *tmp = head_trie;
</span><span style="color:#75715e">    for (int i = 0; find_string[i] != 0; i++)
</span><span style="color:#75715e">    {
</span><span style="color:#75715e">        if (tmp-&gt;next[find_string[i] - &#39;A&#39;] == NULL)
</span><span style="color:#75715e">        {
</span><span style="color:#75715e">            return NULL;
</span><span style="color:#75715e">        }
</span><span style="color:#75715e">        else
</span><span style="color:#75715e">        {
</span><span style="color:#75715e">            tmp = tmp-&gt;next[find_string[i] - &#39;A&#39;];
</span><span style="color:#75715e">        }
</span><span style="color:#75715e">    }
</span><span style="color:#75715e">    return tmp-&gt;val;
</span><span style="color:#75715e">}
</span><span style="color:#75715e">
</span><span style="color:#75715e">inline void trie_insert(char *insert_string, splay_node *val)
</span><span style="color:#75715e">{
</span><span style="color:#75715e">    trie_node *tmp = head_trie;
</span><span style="color:#75715e">    for (int i = 0; insert_string[i] != 0; i++)
</span><span style="color:#75715e">    {
</span><span style="color:#75715e">        if (tmp-&gt;next[insert_string[i] - &#39;A&#39;] == NULL)
</span><span style="color:#75715e">        {
</span><span style="color:#75715e">            tmp-&gt;next[insert_string[i] - &#39;A&#39;] = new_trie();
</span><span style="color:#75715e">        }
</span><span style="color:#75715e">        tmp = tmp-&gt;next[insert_string[i] - &#39;A&#39;];
</span><span style="color:#75715e">    }
</span><span style="color:#75715e">    tmp-&gt;val = val;
</span><span style="color:#75715e">}
</span><span style="color:#75715e">*/</span>

<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">hash_node</span>
{
    splay_node <span style="color:#f92672">*</span>val;
    <span style="color:#66d9ef">char</span> name[<span style="color:#ae81ff">12</span>];
    hash_node <span style="color:#f92672">*</span>next;
    <span style="color:#66d9ef">inline</span> hash_node <span style="color:#f92672">*</span><span style="color:#a6e22e">init</span>()
    {
        next <span style="color:#f92672">=</span> NULL;
        memset(name, <span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">12</span>);
        <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">this</span>;
    }
};

hash_node recover_hash[MAXHASH];
hash_node <span style="color:#f92672">*</span>stack_hash[MAXHASH];
<span style="color:#66d9ef">int</span> top_stack_hash <span style="color:#f92672">=</span> MAXHASH;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">init_hash</span>()
{
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> MAXHASH; i<span style="color:#f92672">++</span>)
    {
        stack_hash[i] <span style="color:#f92672">=</span> recover_hash <span style="color:#f92672">+</span> i;
    }
}

<span style="color:#66d9ef">inline</span> hash_node <span style="color:#f92672">*</span><span style="color:#a6e22e">new_hash</span>()
{
    <span style="color:#66d9ef">return</span> stack_hash[<span style="color:#f92672">--</span>top_stack_hash]<span style="color:#f92672">-&gt;</span>init();
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">delete_hash</span>(hash_node <span style="color:#f92672">*</span>del_node)
{
    stack_hash[top_stack_hash<span style="color:#f92672">++</span>] <span style="color:#f92672">=</span> del_node;
}

hash_node <span style="color:#f92672">*</span>hash_list[MAXHASHLIST];

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">hash</span>(<span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>hash_string)
{
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; hash_string[i] <span style="color:#f92672">!=</span> <span style="color:#ae81ff">0</span>; i<span style="color:#f92672">++</span>)
    {
        ret <span style="color:#f92672">=</span> ret <span style="color:#f92672">*</span> <span style="color:#ae81ff">37</span> <span style="color:#f92672">+</span> hash_string[i] <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;A&#39;</span>;
        <span style="color:#66d9ef">if</span> (ret <span style="color:#f92672">&gt;=</span> MAXHASHLIST)
        {
            ret <span style="color:#f92672">%=</span> MAXHASHLIST;
        }
    }
    <span style="color:#66d9ef">return</span> ret;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">bool</span> <span style="color:#a6e22e">equal</span>(<span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>a, <span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>b)
{
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; (a[i] <span style="color:#f92672">!=</span> <span style="color:#ae81ff">0</span>) <span style="color:#f92672">||</span> (b[i] <span style="color:#f92672">!=</span> <span style="color:#ae81ff">0</span>); i<span style="color:#f92672">++</span>)
    {
        <span style="color:#66d9ef">if</span> (a[i] <span style="color:#f92672">!=</span> b[i])
        {
            <span style="color:#66d9ef">return</span> false;
        }
    }
    <span style="color:#66d9ef">return</span> true;
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">hash_get</span>(<span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>get_string)
{
    hash_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> hash_list[hash(get_string)];
    <span style="color:#66d9ef">while</span> (tmp <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (equal(get_string, tmp<span style="color:#f92672">-&gt;</span>name))
        {
            <span style="color:#66d9ef">return</span> tmp<span style="color:#f92672">-&gt;</span>val;
        }
        tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>next;
    }
    <span style="color:#66d9ef">return</span> NULL;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">hash_insert</span>(<span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>insert_string, splay_node <span style="color:#f92672">*</span>val)
{
    hash_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> hash_list[hash(insert_string)];
    hash_node <span style="color:#f92672">*</span>new_pt <span style="color:#f92672">=</span> new_hash();
    new_pt<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">=</span> val;
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> <span style="color:#ae81ff">10</span>; i<span style="color:#f92672">++</span>)
    {
        new_pt<span style="color:#f92672">-&gt;</span>name[i] <span style="color:#f92672">=</span> insert_string[i];
    }
    <span style="color:#66d9ef">if</span> (tmp <span style="color:#f92672">==</span> NULL)
    {
        hash_list[hash(insert_string)] <span style="color:#f92672">=</span> new_pt;
    }
    <span style="color:#66d9ef">else</span>
    {
        <span style="color:#66d9ef">while</span> (tmp<span style="color:#f92672">-&gt;</span>next <span style="color:#f92672">!=</span> NULL)
        {
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>next;
        }
        tmp<span style="color:#f92672">-&gt;</span>next <span style="color:#f92672">=</span> new_pt;
    }
}

<span style="color:#66d9ef">int</span> n;
<span style="color:#66d9ef">char</span> op_char;
<span style="color:#66d9ef">char</span> op_name[<span style="color:#ae81ff">12</span>];
<span style="color:#66d9ef">int</span> k;
splay_node <span style="color:#f92672">*</span>found;

<span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    ll start_time_ <span style="color:#f92672">=</span> clock();
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;rank.in&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>, stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;rank.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    fread_point <span style="color:#f92672">=</span> getchar();
    read(n);
    init_splay();
    init_hash();
    <span style="color:#75715e">/*
</span><span style="color:#75715e">    init_trie();
</span><span style="color:#75715e">    head_trie = new_trie();
</span><span style="color:#75715e">    */</span>
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> n; i<span style="color:#f92672">++</span>)
    {
        read(op_char);
        read(op_name);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>        printf(<span style="color:#e6db74">&#34;%d %c %s &#34;</span>, i, op_char, op_name);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>        <span style="color:#66d9ef">if</span> (op_char <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;+&#39;</span>)
        {
            read(k);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, k);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>            <span style="color:#66d9ef">if</span> ((found <span style="color:#f92672">=</span> <span style="color:#75715e">/*trie_find(op_name)*/</span> hash_get(op_name)) <span style="color:#f92672">!=</span> NULL)
            {
                splay_change(found, k);
            }
            <span style="color:#66d9ef">else</span>
            {
                hash_insert(op_name, splay_insert(k, op_name));
                <span style="color:#75715e">/*
</span><span style="color:#75715e">                trie_insert(op_name, splay_insert(k, op_name));
</span><span style="color:#75715e">                */</span>
            }
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (op_char <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;?&#39;</span>)
        {
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;n&#34;</span>);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>            <span style="color:#66d9ef">if</span> ((op_name[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">&gt;=</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (op_name[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">&lt;=</span> <span style="color:#e6db74">&#39;9&#39;</span>))
            {
                k <span style="color:#f92672">=</span> string_to_int(op_name);
                splay_query_users(k);
            }
            <span style="color:#66d9ef">else</span>
            {
                printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, splay_query_rank(<span style="color:#75715e">/*trie_find(op_name)*/</span> hash_get(op_name)));
            }
        }
    }
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    printf(<span style="color:#e6db74">&#34;run time: %lld msn&#34;</span>, clock() <span style="color:#f92672">-</span> start_time_);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    fclose(stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>    fclose(stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
}
</code></pre></div>]]></content></item><item><title>[BZOJ3196][TYVJ1730]二逼平衡树（分块·伪）</title><link>https://www.sxn.dev/posts/tyvj1730/</link><pubDate>Wed, 14 May 2014 18:37:34 +0000</pubDate><guid>https://www.sxn.dev/posts/tyvj1730/</guid><description>&lt;p>平衡树三道题终于全A了。为什么说分块是伪呢，毕竟这是平衡树的题目，然后我用了分块（我弱啊，不会树套）。听说TY上还有大爷直接用sort A掉了，这算什么嘛，还有话说我BZOJ上A掉的代码在TY上死活RE30分，还WA了两个点。不管了。。&lt;/p></description><content type="html"><![CDATA[<p>平衡树三道题终于全A了。为什么说分块是伪呢，毕竟这是平衡树的题目，然后我用了分块（我弱啊，不会树套）。听说TY上还有大爷直接用sort A掉了，这算什么嘛，还有话说我BZOJ上A掉的代码在TY上死活RE30分，还WA了两个点。不管了。。</p>
<p>分块的话没什么好说的，就一个带修改的区间第K大，直接上代码</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#75715e">//tyvj 1730.cpp
</span><span style="color:#75715e"></span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;algorithm&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;iostream&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstring&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdlib&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdio&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;string&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cmath&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;queue&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;stack&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;map&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span>
<span style="color:#75715e">//#define LOCAL
</span><span style="color:#75715e"></span><span style="color:#75715e">#define READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define READ_FILE
</span><span style="color:#75715e">//#define VISUAL_STUDIO
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXS <span style="color:#f92672">=</span> <span style="color:#ae81ff">5</span> <span style="color:#f92672">*</span> <span style="color:#ae81ff">1024</span> <span style="color:#f92672">*</span> <span style="color:#ae81ff">1024</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXN <span style="color:#f92672">=</span> <span style="color:#ae81ff">100000</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAX_LENGTH_BLOCK <span style="color:#f92672">=</span> <span style="color:#ae81ff">500</span>;

<span style="color:#75715e">#ifdef LOCAL
</span><span style="color:#75715e">#define LOCAL_TIME
</span><span style="color:#75715e">#define LOCAL_DEBUG
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define LOCAL_DEBUG_NOUT
</span><span style="color:#75715e">//#define LOCAL_SIMP
</span><span style="color:#75715e"></span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;ctime&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef VISUAL_STUDIO
</span><span style="color:#75715e">#pragma warning(disable:4996)
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#75715e">//char fread_string[MAXS];
</span><span style="color:#75715e">//char *fread_point = fread_string;
</span><span style="color:#75715e"></span><span style="color:#66d9ef">char</span> fread_point;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">get_int</span>()
{
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">bool</span> sign <span style="color:#f92672">=</span> false;
    <span style="color:#66d9ef">while</span> ((fread_point <span style="color:#f92672">&lt;</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">||</span> (fread_point <span style="color:#f92672">&gt;</span> <span style="color:#e6db74">&#39;9&#39;</span>) <span style="color:#f92672">||</span> (fread_point <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;-&#39;</span>))
    {
        <span style="color:#66d9ef">if</span> (fread_point <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;-&#39;</span>)
        {
            sign <span style="color:#f92672">=</span> true;
        }
        <span style="color:#66d9ef">else</span>
        {
            sign <span style="color:#f92672">=</span> false;
        }
        fread_point <span style="color:#f92672">=</span> getchar();
    }
    <span style="color:#66d9ef">while</span> ((fread_point <span style="color:#f92672">&gt;=</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (fread_point <span style="color:#f92672">&lt;=</span> <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        ret <span style="color:#f92672">=</span> ret <span style="color:#f92672">*</span> <span style="color:#ae81ff">10</span> <span style="color:#f92672">+</span> fread_point <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;0&#39;</span>;
        fread_point <span style="color:#f92672">=</span> getchar();
    }
    <span style="color:#66d9ef">if</span> (sign)
    {
        <span style="color:#66d9ef">return</span> <span style="color:#f92672">-</span>ret;
    }
    <span style="color:#66d9ef">return</span> ret;
}
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">read</span>(<span style="color:#66d9ef">int</span> <span style="color:#f92672">&amp;</span>a)
{
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>    a <span style="color:#f92672">=</span> get_int();
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>    scanf(<span style="color:#e6db74">&#34;%d&#34;</span>, <span style="color:#f92672">&amp;</span>a);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#66d9ef">typedef</span> <span style="color:#66d9ef">long</span> <span style="color:#66d9ef">long</span> ll;

<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">block_node</span>
{
    <span style="color:#66d9ef">int</span> val[MAX_LENGTH_BLOCK];
    <span style="color:#66d9ef">int</span> order[MAX_LENGTH_BLOCK];
    <span style="color:#66d9ef">int</span> size;
};

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">min</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> a, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> b)
{
    <span style="color:#66d9ef">if</span> (a <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>)
    {
        <span style="color:#66d9ef">return</span> b;
    }
    <span style="color:#66d9ef">if</span> (b <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>)
    {
        <span style="color:#66d9ef">return</span> a;
    }
    <span style="color:#66d9ef">return</span> a <span style="color:#f92672">&lt;</span> b <span style="color:#f92672">?</span> a : b;
}

block_node block_list[MAXN <span style="color:#f92672">/</span> MAX_LENGTH_BLOCK];

<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> OP_Q_RANK <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> OP_Q_NUM <span style="color:#f92672">=</span> <span style="color:#ae81ff">2</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> OP_CHANGE <span style="color:#f92672">=</span> <span style="color:#ae81ff">3</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> OP_PREV <span style="color:#f92672">=</span> <span style="color:#ae81ff">4</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> OP_NEXT <span style="color:#f92672">=</span> <span style="color:#ae81ff">5</span>;

<span style="color:#66d9ef">int</span> n, m;
<span style="color:#66d9ef">int</span> init_read[MAXN];
<span style="color:#66d9ef">int</span> op, op_l, op_r, k;
<span style="color:#66d9ef">int</span> num_max <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>, num_min <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">block_init</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> n)
{
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>, j <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; j <span style="color:#f92672">&lt;</span> n; i<span style="color:#f92672">++</span>, j <span style="color:#f92672">+=</span> MAX_LENGTH_BLOCK)
    {
        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> t <span style="color:#f92672">=</span> j; t <span style="color:#f92672">&lt;</span> j <span style="color:#f92672">+</span> MAX_LENGTH_BLOCK, t <span style="color:#f92672">&lt;</span> n; t<span style="color:#f92672">++</span>)
        {
            block_list[i].val[t <span style="color:#f92672">-</span> j] <span style="color:#f92672">=</span> init_read[t];
        }
        block_list[i].size <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>min(MAX_LENGTH_BLOCK, n <span style="color:#f92672">-</span> j);
        memcpy(block_list[i].order, block_list[i].val, block_list[i].size <span style="color:#f92672">*</span> <span style="color:#66d9ef">sizeof</span>(<span style="color:#66d9ef">int</span>));
        std<span style="color:#f92672">::</span>sort(block_list[i].order, block_list[i].order <span style="color:#f92672">+</span> block_list[i].size);
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">block_find</span>(<span style="color:#66d9ef">int</span> <span style="color:#f92672">&amp;</span>x)
{
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> x <span style="color:#f92672">/</span> MAX_LENGTH_BLOCK;
    x <span style="color:#f92672">%=</span> MAX_LENGTH_BLOCK;
    <span style="color:#66d9ef">return</span> ret;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">block_smaller</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> block, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
    <span style="color:#66d9ef">int</span> l <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>, r <span style="color:#f92672">=</span> block_list[block].size;
    <span style="color:#66d9ef">int</span> mid;
    <span style="color:#66d9ef">while</span> (l <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">&lt;</span> r)
    {
        mid <span style="color:#f92672">=</span> (l <span style="color:#f92672">+</span> r) <span style="color:#f92672">&gt;&gt;</span> <span style="color:#ae81ff">1</span>;
        <span style="color:#66d9ef">if</span> (block_list[block].order[mid] <span style="color:#f92672">&gt;=</span> val)
        {
            r <span style="color:#f92672">=</span> mid;
        }
        <span style="color:#66d9ef">else</span>
        {
            l <span style="color:#f92672">=</span> mid <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
        }
    }
    <span style="color:#66d9ef">while</span> ((l <span style="color:#f92672">&lt;</span> block_list[block].size) <span style="color:#f92672">&amp;&amp;</span> (block_list[block].order[l] <span style="color:#f92672">&lt;</span> val))
    {
        l<span style="color:#f92672">++</span>;
    }
    <span style="color:#66d9ef">return</span> l;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">block_query_smaller</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> block, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> l, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> r, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> l; i <span style="color:#f92672">&lt;=</span> r; i<span style="color:#f92672">++</span>)
    {
        <span style="color:#66d9ef">if</span> (block_list[block].val[i] <span style="color:#f92672">&lt;</span> val)
        {
            ret<span style="color:#f92672">++</span>;
        }
    }
    <span style="color:#66d9ef">return</span> ret;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">block_b_smaller</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> block, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
    <span style="color:#66d9ef">int</span> binary_l <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>, binary_r <span style="color:#f92672">=</span> block_list[block].size, mid;
    <span style="color:#66d9ef">while</span> (binary_l <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">&lt;</span> binary_r)
    {
        mid <span style="color:#f92672">=</span> (binary_l <span style="color:#f92672">+</span> binary_r) <span style="color:#f92672">&gt;&gt;</span> <span style="color:#ae81ff">1</span>;
        <span style="color:#66d9ef">if</span> (block_list[block].order[mid] <span style="color:#f92672">&gt;=</span> val)
        {
            binary_r <span style="color:#f92672">=</span> mid;
        }
        <span style="color:#66d9ef">else</span>
        {
            binary_l <span style="color:#f92672">=</span> mid;
        }
    }
    <span style="color:#75715e">/*while ((binary_l &lt; block_list[block].size - 1) &amp;&amp; (block_list[block].order[binary_l + 1] &lt; val))
</span><span style="color:#75715e">    {
</span><span style="color:#75715e">        binary_l++;
</span><span style="color:#75715e">    }*/</span>
    <span style="color:#66d9ef">while</span> ((binary_l <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>) <span style="color:#f92672">&amp;&amp;</span> (block_list[block].order[binary_l] <span style="color:#f92672">&gt;=</span> val))
    {
        binary_l<span style="color:#f92672">--</span>;
    }
    <span style="color:#66d9ef">if</span> (block_list[block].order[binary_l] <span style="color:#f92672">&gt;=</span> val)
    {
        <span style="color:#66d9ef">return</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
    }
    <span style="color:#66d9ef">return</span> block_list[block].order[binary_l];
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">block_query_b_smaller</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> block, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> l, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> r, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
    <span style="color:#66d9ef">int</span> max_num <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> l; i <span style="color:#f92672">&lt;=</span> r; i<span style="color:#f92672">++</span>)
    {
        <span style="color:#66d9ef">if</span> (block_list[block].val[i] <span style="color:#f92672">&lt;</span> val)
        {
            max_num <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(max_num, block_list[block].val[i]);
        }
    }
    <span style="color:#66d9ef">return</span> max_num;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">block_s_bigger</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> block, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
    <span style="color:#66d9ef">int</span> binary_l <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>, binary_r <span style="color:#f92672">=</span> block_list[block].size, mid;
    <span style="color:#66d9ef">while</span> (binary_l <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">&lt;</span> binary_r)
    {
        mid <span style="color:#f92672">=</span> (binary_l <span style="color:#f92672">+</span> binary_r) <span style="color:#f92672">&gt;&gt;</span> <span style="color:#ae81ff">1</span>;
        <span style="color:#66d9ef">if</span> (block_list[block].order[mid] <span style="color:#f92672">&gt;</span> val)
        {
            binary_r <span style="color:#f92672">=</span> mid;
        }
        <span style="color:#66d9ef">else</span>
        {
            binary_l <span style="color:#f92672">=</span> mid;
        }
    }
    <span style="color:#66d9ef">while</span> ((binary_l <span style="color:#f92672">&lt;</span> block_list[block].size <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>) <span style="color:#f92672">&amp;&amp;</span> (block_list[block].order[binary_l] <span style="color:#f92672">&lt;=</span> val))
    {
        binary_l<span style="color:#f92672">++</span>;
    }
    <span style="color:#66d9ef">if</span> (block_list[block].order[binary_l] <span style="color:#f92672">&lt;=</span> val)
    {
        <span style="color:#66d9ef">return</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
    }
    <span style="color:#66d9ef">return</span> block_list[block].order[binary_l];
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">block_query_s_bigger</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> block, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> l, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> r, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
    <span style="color:#66d9ef">int</span> min_num <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> l; i <span style="color:#f92672">&lt;=</span> r; i<span style="color:#f92672">++</span>)
    {
        <span style="color:#66d9ef">if</span> (block_list[block].val[i] <span style="color:#f92672">&gt;</span> val)
        {
            min_num <span style="color:#f92672">=</span> min(min_num, block_list[block].val[i]);
        }
    }
    <span style="color:#66d9ef">return</span> min_num;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">block_query_rank</span>(<span style="color:#66d9ef">int</span> l, <span style="color:#66d9ef">int</span> r, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
    <span style="color:#66d9ef">int</span> block_l <span style="color:#f92672">=</span> block_find(l);
    <span style="color:#66d9ef">int</span> block_r <span style="color:#f92672">=</span> block_find(r);
    <span style="color:#66d9ef">if</span> (block_l <span style="color:#f92672">==</span> block_r)
    {
        <span style="color:#66d9ef">if</span> ((l <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>) <span style="color:#f92672">&amp;&amp;</span> (r <span style="color:#f92672">==</span> block_list[block_l].size <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>))
        {
            <span style="color:#66d9ef">return</span> block_smaller(block_l, val) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
        }
        <span style="color:#66d9ef">else</span>
        {
            <span style="color:#66d9ef">return</span> block_query_smaller(block_l, l, r, val) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
        }
    }
    <span style="color:#66d9ef">else</span>
    {
        <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
        <span style="color:#66d9ef">if</span> (l <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>)
        {
            ret <span style="color:#f92672">+=</span> block_smaller(block_l, val);
        }
        <span style="color:#66d9ef">else</span>
        {
            ret <span style="color:#f92672">+=</span> block_query_smaller(block_l, l, block_list[block_l].size <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>, val);
        }
        <span style="color:#66d9ef">if</span> (r <span style="color:#f92672">==</span> block_list[block_l].size <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>)
        {
            ret <span style="color:#f92672">+=</span> block_smaller(block_r, val);
        }
        <span style="color:#66d9ef">else</span>
        {
            ret <span style="color:#f92672">+=</span> block_query_smaller(block_r, <span style="color:#ae81ff">0</span>, r, val);
        }
        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> block_l <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;</span> block_r; i<span style="color:#f92672">++</span>)
        {
            ret <span style="color:#f92672">+=</span> block_smaller(i, val);
        }
        <span style="color:#66d9ef">return</span> ret <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">block_query_num</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> l, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> r, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> k)
{
    <span style="color:#66d9ef">int</span> binary_l <span style="color:#f92672">=</span> num_min, binary_r <span style="color:#f92672">=</span> num_max, mid;
    <span style="color:#66d9ef">int</span> ret;
    <span style="color:#66d9ef">while</span> (binary_l <span style="color:#f92672">&lt;</span> binary_r)
    {
        mid <span style="color:#f92672">=</span> (binary_l <span style="color:#f92672">+</span> binary_r) <span style="color:#f92672">&gt;&gt;</span> <span style="color:#ae81ff">1</span>;
        ret <span style="color:#f92672">=</span> block_query_rank(l, r, mid) <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>;
        <span style="color:#66d9ef">if</span> ((ret <span style="color:#f92672">&lt;</span> k) <span style="color:#f92672">&amp;&amp;</span> (block_query_rank(l, r, mid <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>) <span style="color:#f92672">&gt;</span> k))
        {
            <span style="color:#66d9ef">return</span> mid;
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (ret <span style="color:#f92672">&lt;</span> k)
        {
            binary_l <span style="color:#f92672">=</span> mid <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
        }
        <span style="color:#66d9ef">else</span>
        {
            binary_r <span style="color:#f92672">=</span> mid <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>;
        }
    }
    <span style="color:#66d9ef">return</span> binary_l;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">block_change</span>(<span style="color:#66d9ef">int</span> pt, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
    <span style="color:#66d9ef">int</span> block_pt <span style="color:#f92672">=</span> block_find(pt);
    <span style="color:#66d9ef">if</span> (block_list[block_pt].val[pt] <span style="color:#f92672">==</span> val)
    {
        <span style="color:#66d9ef">return</span>;
    }
    <span style="color:#66d9ef">int</span> binary_l <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>, binary_r <span style="color:#f92672">=</span> block_list[block_pt].size, mid;
    <span style="color:#66d9ef">int</span> loop <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
    <span style="color:#75715e">/*while (binary_l + 1 &lt; binary_r)
</span><span style="color:#75715e">    {
</span><span style="color:#75715e">        mid = (binary_l + binary_r) &gt;&gt; 1;
</span><span style="color:#75715e">        if (block_list[block_pt].order[mid] == block_list[block_pt].val[pt])
</span><span style="color:#75715e">        {
</span><span style="color:#75715e">            loop = mid;
</span><span style="color:#75715e">            break;
</span><span style="color:#75715e">        }
</span><span style="color:#75715e">        else if (block_list[block_pt].order[mid] &gt; block_list[block_pt].val[pt])
</span><span style="color:#75715e">        {
</span><span style="color:#75715e">            binary_l = mid;
</span><span style="color:#75715e">        }
</span><span style="color:#75715e">        else
</span><span style="color:#75715e">        {
</span><span style="color:#75715e">            binary_r = mid;
</span><span style="color:#75715e">        }
</span><span style="color:#75715e">    }*/</span>
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> block_list[block_pt].size; i<span style="color:#f92672">++</span>)
    {
        <span style="color:#66d9ef">if</span> (block_list[block_pt].order[i] <span style="color:#f92672">==</span> block_list[block_pt].val[pt])
        {
            loop <span style="color:#f92672">=</span> i;
        }
    }
    <span style="color:#66d9ef">if</span> (loop <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>)
    {
        loop <span style="color:#f92672">=</span> binary_l;
    }
    <span style="color:#66d9ef">if</span> (block_list[block_pt].val[pt] <span style="color:#f92672">&lt;</span> val)
    {
        <span style="color:#66d9ef">while</span> ((loop <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">&lt;</span> block_list[block_pt].size) <span style="color:#f92672">&amp;&amp;</span> (block_list[block_pt].order[loop <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">&lt;</span> val))
        {
            block_list[block_pt].order[loop] <span style="color:#f92672">=</span> block_list[block_pt].order[loop <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>];
            loop<span style="color:#f92672">++</span>;
        }
        block_list[block_pt].order[loop] <span style="color:#f92672">=</span> val;
    }
    <span style="color:#66d9ef">else</span>
    {
        <span style="color:#66d9ef">while</span> ((loop <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>) <span style="color:#f92672">&amp;&amp;</span> (block_list[block_pt].order[loop <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">&gt;</span> val))
        {
            block_list[block_pt].order[loop] <span style="color:#f92672">=</span> block_list[block_pt].order[loop <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>];
            loop<span style="color:#f92672">--</span>;
        }
        block_list[block_pt].order[loop] <span style="color:#f92672">=</span> val;
    }
    block_list[block_pt].val[pt] <span style="color:#f92672">=</span> val;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">block_prev</span>(<span style="color:#66d9ef">int</span> l, <span style="color:#66d9ef">int</span> r, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
    <span style="color:#66d9ef">int</span> block_l <span style="color:#f92672">=</span> block_find(l);
    <span style="color:#66d9ef">int</span> block_r <span style="color:#f92672">=</span> block_find(r);
    <span style="color:#66d9ef">if</span> (block_l <span style="color:#f92672">==</span> block_r)
    {
        <span style="color:#66d9ef">if</span> ((l <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>) <span style="color:#f92672">&amp;&amp;</span> (r <span style="color:#f92672">==</span> block_list[block_l].size <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>))
        {
            <span style="color:#66d9ef">return</span> block_b_smaller(block_l, val);
        }
        <span style="color:#66d9ef">else</span>
        {
            <span style="color:#66d9ef">return</span> block_query_b_smaller(block_l, l, r, val);
        }
    }
    <span style="color:#66d9ef">else</span>
    {
        <span style="color:#66d9ef">int</span> ret;
        <span style="color:#66d9ef">if</span> (l <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>)
        {
            ret <span style="color:#f92672">=</span> block_b_smaller(block_l, val);
        }
        <span style="color:#66d9ef">else</span>
        {
            ret <span style="color:#f92672">=</span> block_query_b_smaller(block_l, l, block_list[block_l].size <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>, val);
        }
        <span style="color:#66d9ef">if</span> (r <span style="color:#f92672">==</span> block_list[block_r].size <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>)
        {
            ret <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(ret, block_b_smaller(block_r, val));
        }
        <span style="color:#66d9ef">else</span>
        {
            ret <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(ret, block_query_b_smaller(block_r, <span style="color:#ae81ff">0</span>, r, val));
        }
        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> block_l <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;</span> block_r; i<span style="color:#f92672">++</span>)
        {
            ret <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(ret, block_b_smaller(i, val));
            <span style="color:#75715e">//ret = std::max(ret, block_query_b_smaller(i, 0, block_list[block_l].size - 1, val));
</span><span style="color:#75715e"></span>        }
        <span style="color:#66d9ef">return</span> ret;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">block_next</span>(<span style="color:#66d9ef">int</span> l, <span style="color:#66d9ef">int</span> r, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
    <span style="color:#66d9ef">int</span> block_l <span style="color:#f92672">=</span> block_find(l);
    <span style="color:#66d9ef">int</span> block_r <span style="color:#f92672">=</span> block_find(r);
    <span style="color:#66d9ef">if</span> (block_l <span style="color:#f92672">==</span> block_r)
    {
        <span style="color:#66d9ef">if</span> ((l <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>) <span style="color:#f92672">&amp;&amp;</span> (r <span style="color:#f92672">==</span> block_list[block_l].size <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>))
        {
            <span style="color:#66d9ef">return</span> block_s_bigger(block_l, val);
        }
        <span style="color:#66d9ef">else</span>
        {
            <span style="color:#66d9ef">return</span> block_query_s_bigger(block_l, l, r, val);
        }
    }
    <span style="color:#66d9ef">else</span>
    {
        <span style="color:#66d9ef">int</span> ret;
        <span style="color:#66d9ef">if</span> (l <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>)
        {
            ret <span style="color:#f92672">=</span> block_s_bigger(block_l, val);
        }
        <span style="color:#66d9ef">else</span>
        {
            ret <span style="color:#f92672">=</span> block_query_s_bigger(block_l, l, block_list[block_l].size <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>, val);
        }
        <span style="color:#66d9ef">if</span> (r <span style="color:#f92672">==</span> block_list[block_r].size <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>)
        {
            ret <span style="color:#f92672">=</span> min(ret, block_s_bigger(block_r, val));
        }
        <span style="color:#66d9ef">else</span>
        {
            ret <span style="color:#f92672">=</span> min(ret, block_query_s_bigger(block_r, <span style="color:#ae81ff">0</span>, r, val));
        }
        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> block_l <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;</span> block_r; i<span style="color:#f92672">++</span>)
        {
            ret <span style="color:#f92672">=</span> min(ret, block_s_bigger(i, val));
        }
        <span style="color:#66d9ef">return</span> ret;
    }
}

<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span><span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">checker</span>()
{
    <span style="color:#66d9ef">int</span> loop <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">int</span> pt <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> n; i<span style="color:#f92672">++</span>)
    {
        <span style="color:#66d9ef">if</span> (pt <span style="color:#f92672">&gt;=</span> block_list[loop].size)
        {
            pt <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
            loop<span style="color:#f92672">++</span>;
        }
        printf(<span style="color:#e6db74">&#34;%d &#34;</span>, block_list[loop].val[pt]);
        pt<span style="color:#f92672">++</span>;
    }
    printf(<span style="color:#e6db74">&#34;n&#34;</span>);
}
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifndef LOCAL_SIMP
</span><span style="color:#75715e"></span><span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    ll start_time_ <span style="color:#f92672">=</span> clock();
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;input4.in&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>, stdin);
    freopen(<span style="color:#e6db74">&#34;3196.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    fread_point <span style="color:#f92672">=</span> getchar();
    read(n);
    read(m);
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> n; i<span style="color:#f92672">++</span>)
    {
        read(init_read[i]);
        num_max <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(num_max, init_read[i]);
        num_min <span style="color:#f92672">=</span> min(num_min, init_read[i]);
    }
    block_init(n);
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> m; i<span style="color:#f92672">++</span>)
    {
        read(op);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>        printf(<span style="color:#e6db74">&#34;%d %d &#34;</span>, i, op);
        <span style="color:#66d9ef">if</span> (i <span style="color:#f92672">==</span> <span style="color:#ae81ff">446</span>)
        {
            <span style="color:#75715e">//printf(&#34;DEBUG &#34;);
</span><span style="color:#75715e"></span>        }
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>        <span style="color:#66d9ef">if</span> (op <span style="color:#f92672">==</span> OP_Q_RANK)
        {
            read(op_l);
            read(op_r);
            read(k);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;%d %d %dn&#34;</span>, op_l, op_r, k);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifndef LOCAL_DEBUG_NOUT
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, block_query_rank(op_l <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>, op_r <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>, k));
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (op <span style="color:#f92672">==</span> OP_Q_NUM)
        {
            read(op_l);
            read(op_r);
            read(k);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;%d %d %dn&#34;</span>, op_l, op_r, k);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifndef LOCAL_DEBUG_NOUT
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, block_query_num(op_l <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>, op_r <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>, k));
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (op <span style="color:#f92672">==</span> OP_CHANGE)
        {
            read(op_l);
            read(k);
            num_max <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(num_max, k);
            num_min <span style="color:#f92672">=</span> min(num_min, k);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;%d %dn&#34;</span>, op_l, k);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>            block_change(op_l <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>, k);
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (op <span style="color:#f92672">==</span> OP_PREV)
        {
            read(op_l);
            read(op_r);
            read(k);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;%d %d %dn&#34;</span>, op_l, op_r, k);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span><span style="color:#75715e">//#ifndef LOCAL_DEBUG_NOUT
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, block_prev(op_l <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>, op_r <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>, k));
<span style="color:#75715e">//#endif
</span><span style="color:#75715e"></span>        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (op <span style="color:#f92672">==</span> OP_NEXT)
        {
            read(op_l);
            read(op_r);
            read(k);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;%d %d %dn&#34;</span>, op_l, op_r, k);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span><span style="color:#75715e">//#ifndef LOCAL_DEBUG_NOUT
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, block_next(op_l <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>, op_r <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>, k));
<span style="color:#75715e">//#endif
</span><span style="color:#75715e"></span>        }
<span style="color:#75715e">#ifdef LOCAL_DEBUG_NOUT
</span><span style="color:#75715e"></span>        checker();
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    }
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    printf(<span style="color:#e6db74">&#34;run time: %lld msn&#34;</span>, clock() <span style="color:#f92672">-</span> start_time_);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    fclose(stdin);
    fclose(stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
}
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span><span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
    freopen(<span style="color:#e6db74">&#34;3196.in&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>, stdin);
    freopen(<span style="color:#e6db74">&#34;3196simp.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
    fread_point <span style="color:#f92672">=</span> getchar();
    read(n);
    read(m);
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> n; i<span style="color:#f92672">++</span>)
    {
        read(init_read[i]);
        num_max <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(num_max, init_read[i]);
        num_min <span style="color:#f92672">=</span> min(num_min, init_read[i]);
    }
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> m; i<span style="color:#f92672">++</span>)
    {
        read(op);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>        printf(<span style="color:#e6db74">&#34;%d %d &#34;</span>, i, op);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>        <span style="color:#66d9ef">if</span> (op <span style="color:#f92672">==</span> OP_Q_RANK)
        {
            read(op_l);
            read(op_r);
            read(k);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;%d %d %dn&#34;</span>, op_l, op_r, k);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (op <span style="color:#f92672">==</span> OP_Q_NUM)
        {
            read(op_l);
            read(op_r);
            read(k);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;%d %d %dn&#34;</span>, op_l, op_r, k);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (op <span style="color:#f92672">==</span> OP_CHANGE)
        {
            read(op_l);
            read(k);
            num_max <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(num_max, k);
            num_min <span style="color:#f92672">=</span> min(num_min, k);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;%d %dn&#34;</span>, op_l, k);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>            init_read[op_l <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">=</span> k;
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (op <span style="color:#f92672">==</span> OP_PREV)
        {
            read(op_l);
            read(op_r);
            read(k);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;%d %d %dn&#34;</span>, op_l, op_r, k);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>            <span style="color:#66d9ef">int</span> max_num <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
            <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> op_l <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;</span> op_r; i<span style="color:#f92672">++</span>)
            {
                <span style="color:#66d9ef">if</span> (init_read[i] <span style="color:#f92672">&lt;</span> k)
                {
                    max_num <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(max_num, init_read[i]);
                }
            }
            printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, max_num);
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (op <span style="color:#f92672">==</span> OP_NEXT)
        {
            read(op_l);
            read(op_r);
            read(k);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;%d %d %dn&#34;</span>, op_l, op_r, k);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>            <span style="color:#66d9ef">int</span> min_num <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
            <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> op_l <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;</span> op_r; i<span style="color:#f92672">++</span>)
            {
                <span style="color:#66d9ef">if</span> (init_read[i] <span style="color:#f92672">&gt;</span> k)
                {
                    min_num <span style="color:#f92672">=</span> min(min_num, init_read[i]);
                }
            }
            printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, min_num);
        }
        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> j <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; j <span style="color:#f92672">&lt;</span> n; j<span style="color:#f92672">++</span>)
        {
            printf(<span style="color:#e6db74">&#34;%d &#34;</span>, init_read[j]);
        }
        printf(<span style="color:#e6db74">&#34;n&#34;</span>);
    }
    fclose(stdin);
    fclose(stdout);
}
<span style="color:#75715e">#endif
</span></code></pre></div>]]></content></item><item><title>[BZOJ3337]ORZJRY I（块状链表）</title><link>https://www.sxn.dev/posts/bzoj3337/</link><pubDate>Mon, 05 May 2014 19:03:46 +0000</pubDate><guid>https://www.sxn.dev/posts/bzoj3337/</guid><description>保佑我能写出来。。</description><content type="html">&lt;p>保佑我能写出来。。&lt;/p></content></item><item><title>[BZOJ3223][TYVJ1729]文艺平衡树（FANHQ_TREAP）</title><link>https://www.sxn.dev/posts/tyvj1729/</link><pubDate>Fri, 02 May 2014 19:53:46 +0000</pubDate><guid>https://www.sxn.dev/posts/tyvj1729/</guid><description>&lt;p>平衡树三件套的第三题目测要树套，我太弱了所以不会，只好接着用FANHQ_TREAP水第二题了。听说这题目只有一个操作，于是很高端地用了FANHQ_TREAP。但是莫名其妙写得好慢，比RANK1慢了1S多，一定是还有什么神奇的算法，求教。。&lt;/p></description><content type="html"><![CDATA[<p>平衡树三件套的第三题目测要树套，我太弱了所以不会，只好接着用FANHQ_TREAP水第二题了。听说这题目只有一个操作，于是很高端地用了FANHQ_TREAP。但是莫名其妙写得好慢，比RANK1慢了1S多，一定是还有什么神奇的算法，求教。。</p>
<p>关于FANHQ_TREAP的问题详见我的上一篇日志<a href="http://shenxn.sinaapp.com/tyvj1728.html" title="[TYVJ1728]普通平衡树（FANHQ_TREAP）">[TYVJ1728]普通平衡树（FANHQ_TREAP）</a>FANHQ_TREAP好像能实现SPLAY几乎全部的操作，而且支持持久化，常数又小，听起来就很高端。。</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#75715e">//BZOJ 3223.cpp fanhq_treap
</span><span style="color:#75715e"></span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;algorithm&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;iostream&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstring&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdlib&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdio&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;string&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cmath&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;queue&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;stack&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span>
<span style="color:#75715e">//#define LOCAL
</span><span style="color:#75715e">//#define READ_FILE
</span><span style="color:#75715e"></span><span style="color:#75715e">#define READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define VISUAL_STUDIO
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef VISUAL_STUDIO
</span><span style="color:#75715e">#pragma warning(disable:4996)
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL
</span><span style="color:#75715e">#define LOCAL_TIME
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define LOCAL_DEBUG
</span><span style="color:#75715e">//#define STD_DEBUG
</span><span style="color:#75715e"></span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;ctime&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifndef NULL
</span><span style="color:#75715e">#define NULL 0
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">typedef</span> <span style="color:#66d9ef">long</span> <span style="color:#66d9ef">long</span> ll;

<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#75715e">/*const int MAXS = 10 * 1024 * 1024;
</span><span style="color:#75715e">
</span><span style="color:#75715e">char fread_string[MAXS];
</span><span style="color:#75715e">char *fread_point = fread_string;*/</span>

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">get_int</span>()
{
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">char</span> fread_point <span style="color:#f92672">=</span> getchar();
    <span style="color:#66d9ef">while</span> ((fread_point <span style="color:#f92672">&lt;</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">||</span> (fread_point <span style="color:#f92672">&gt;</span>  <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        fread_point <span style="color:#f92672">=</span> getchar();
    }
    <span style="color:#66d9ef">while</span> ((fread_point <span style="color:#f92672">&gt;=</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (fread_point <span style="color:#f92672">&lt;=</span> <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        ret <span style="color:#f92672">=</span> ret <span style="color:#f92672">*</span> <span style="color:#ae81ff">10</span> <span style="color:#f92672">+</span> fread_point <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;0&#39;</span>;
        fread_point <span style="color:#f92672">=</span> getchar();
    }
    <span style="color:#66d9ef">return</span> ret;
}
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">read</span>(<span style="color:#66d9ef">int</span> <span style="color:#f92672">&amp;</span>input_num)
{
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>    input_num <span style="color:#f92672">=</span> get_int();
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>    scanf(<span style="color:#e6db74">&#34;%d&#34;</span>, <span style="color:#f92672">&amp;</span>input_num);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#75715e">/*---rank---*/</span>
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> rand_base <span style="color:#f92672">=</span> <span style="color:#ae81ff">79</span>;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">get_rank</span>()
{
    <span style="color:#66d9ef">return</span> (rand() <span style="color:#f92672">&lt;&lt;</span> <span style="color:#ae81ff">11</span>) <span style="color:#f92672">+</span> rand();
}
<span style="color:#75715e">/*---rank---*/</span>

<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">treap_node</span>
{
    <span style="color:#66d9ef">int</span> val;
    treap_node <span style="color:#f92672">*</span>l_child, <span style="color:#f92672">*</span>r_child, <span style="color:#f92672">*</span>parent;
    <span style="color:#66d9ef">bool</span> down_swap;
    <span style="color:#66d9ef">int</span> size, rank;
    <span style="color:#66d9ef">inline</span> treap_node <span style="color:#f92672">*</span><span style="color:#a6e22e">init</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val_, treap_node <span style="color:#f92672">*</span>l_child_, treap_node <span style="color:#f92672">*</span>r_child_, treap_node <span style="color:#f92672">*</span>parent_)
    {
        val <span style="color:#f92672">=</span> val_;
        l_child <span style="color:#f92672">=</span> l_child_;
        r_child <span style="color:#f92672">=</span> r_child_;
        parent <span style="color:#f92672">=</span> parent_;
        down_swap <span style="color:#f92672">=</span> false;
        size <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
        <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">this</span>;
    }
    <span style="color:#66d9ef">inline</span> <span style="color:#a6e22e">treap_node</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val_ <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>, treap_node <span style="color:#f92672">*</span>l_child_ <span style="color:#f92672">=</span> NULL, treap_node <span style="color:#f92672">*</span>r_child_ <span style="color:#f92672">=</span> NULL, treap_node <span style="color:#f92672">*</span>parent_ <span style="color:#f92672">=</span> NULL)
    {
        init(val_, l_child_, r_child_, parent_);
    }
};

<span style="color:#75715e">/*---recover memory---*/</span>
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXN <span style="color:#f92672">=</span> <span style="color:#ae81ff">100000</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">10</span>;

treap_node node_memory[MAXN];
treap_node <span style="color:#f92672">*</span>memory_stack[MAXN];
<span style="color:#66d9ef">int</span> stack_top <span style="color:#f92672">=</span> MAXN;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">init_memory</span>()
{
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> MAXN; i<span style="color:#f92672">++</span>)
    {
        memory_stack[i] <span style="color:#f92672">=</span> node_memory <span style="color:#f92672">+</span> i;
        node_memory[i].rank <span style="color:#f92672">=</span> get_rank();
    }
}

<span style="color:#66d9ef">inline</span> treap_node <span style="color:#f92672">*</span><span style="color:#a6e22e">new_node</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>, treap_node <span style="color:#f92672">*</span>l_child <span style="color:#f92672">=</span> NULL, treap_node <span style="color:#f92672">*</span>r_child <span style="color:#f92672">=</span> NULL, treap_node <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> NULL)
{
    <span style="color:#66d9ef">return</span> memory_stack[<span style="color:#f92672">--</span>stack_top]<span style="color:#f92672">-&gt;</span>init(val, l_child, r_child, parent);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">delete_node</span>(treap_node <span style="color:#f92672">*</span>del_node)
{
    memory_stack[stack_top<span style="color:#f92672">++</span>] <span style="color:#f92672">=</span> del_node;
}
<span style="color:#75715e">/*---recover memory---*/</span>

treap_node <span style="color:#f92672">*</span>head <span style="color:#f92672">=</span> NULL;

<span style="color:#75715e">/*---treap---*/</span>
<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">attach_as_l_child</span>(treap_node <span style="color:#f92672">*</span>parent, treap_node <span style="color:#f92672">*</span>child)
{
    parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> child;
    <span style="color:#66d9ef">if</span> (child <span style="color:#f92672">!=</span> NULL)
    {
        child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">attach_as_r_child</span>(treap_node <span style="color:#f92672">*</span>parent, treap_node <span style="color:#f92672">*</span>child)
{
    parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> child;
    <span style="color:#66d9ef">if</span> (child <span style="color:#f92672">!=</span> NULL)
    {
        child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">treap_swap</span>(treap_node <span style="color:#f92672">*</span>swap_node)
{
    <span style="color:#66d9ef">if</span> (swap_node <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span>;
    }
    std<span style="color:#f92672">::</span>swap(swap_node<span style="color:#f92672">-&gt;</span>l_child, swap_node<span style="color:#f92672">-&gt;</span>r_child);
    swap_node<span style="color:#f92672">-&gt;</span>down_swap <span style="color:#f92672">=</span> <span style="color:#f92672">!</span>swap_node<span style="color:#f92672">-&gt;</span>down_swap;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">treap_size</span>(treap_node <span style="color:#f92672">*</span>query_node)
{
    <span style="color:#66d9ef">if</span> (query_node <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
    }
    <span style="color:#66d9ef">return</span> query_node<span style="color:#f92672">-&gt;</span>size;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">treap_update_size</span>(treap_node <span style="color:#f92672">*</span>update_node)
{
    <span style="color:#66d9ef">if</span> (update_node <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span>;
    }
    update_node<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> treap_size(update_node<span style="color:#f92672">-&gt;</span>l_child) <span style="color:#f92672">+</span> treap_size(update_node<span style="color:#f92672">-&gt;</span>r_child) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">treap_down_swap</span>(treap_node <span style="color:#f92672">*</span>down_node)
{
    <span style="color:#66d9ef">if</span> (down_node <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span>;
    }
    <span style="color:#66d9ef">if</span> (down_node<span style="color:#f92672">-&gt;</span>down_swap)
    {
        treap_swap(down_node<span style="color:#f92672">-&gt;</span>l_child);
        treap_swap(down_node<span style="color:#f92672">-&gt;</span>r_child);
        down_node<span style="color:#f92672">-&gt;</span>down_swap <span style="color:#f92672">=</span> false;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">treap_down</span>(treap_node <span style="color:#f92672">*</span>down_node)
{
    treap_down_swap(down_node);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">treap_update</span>(treap_node <span style="color:#f92672">*</span>update_node)
{
    treap_update_size(update_node);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zig</span>(treap_node <span style="color:#f92672">*</span>axis)
{
    treap_node <span style="color:#f92672">*</span>left_child <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>l_child;
    treap_node <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>parent;
    treap_down(axis);
    treap_down(left_child);
    attach_as_l_child(axis, left_child<span style="color:#f92672">-&gt;</span>r_child);
    attach_as_r_child(left_child, axis);
    left_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    <span style="color:#66d9ef">if</span> (parent <span style="color:#f92672">==</span> NULL)
    {
        head <span style="color:#f92672">=</span> left_child;
    }
    <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> axis)
    {
        parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> left_child;
    }
    <span style="color:#66d9ef">else</span>
    {
        parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> left_child;
    }
    treap_update(axis);
    treap_update(left_child);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zag</span>(treap_node <span style="color:#f92672">*</span>axis)
{
    treap_node <span style="color:#f92672">*</span>right_child <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>r_child;
    treap_node <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>parent;
    treap_down(axis);
    treap_down(right_child);
    attach_as_r_child(axis, right_child<span style="color:#f92672">-&gt;</span>l_child);
    attach_as_l_child(right_child, axis);
    right_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    <span style="color:#66d9ef">if</span> (parent <span style="color:#f92672">==</span> NULL)
    {
        head <span style="color:#f92672">=</span> right_child;
    }
    <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> axis)
    {
        parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> right_child;
    }
    <span style="color:#66d9ef">else</span>
    {
        parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> right_child;
    }
    treap_update(axis);
    treap_update(right_child);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">treap_insert_size</span>(treap_node <span style="color:#f92672">*</span>v)
{
    <span style="color:#66d9ef">for</span> (; v <span style="color:#f92672">!=</span> NULL; v <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>parent)
    {
        v<span style="color:#f92672">-&gt;</span>size<span style="color:#f92672">++</span>;
    }
}

<span style="color:#66d9ef">void</span> <span style="color:#a6e22e">treap_cut</span>(treap_node <span style="color:#f92672">*</span>root, treap_node <span style="color:#f92672">*&amp;</span>treap_left, treap_node <span style="color:#f92672">*&amp;</span>treap_right, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> cut_left)
{
    <span style="color:#66d9ef">if</span> (cut_left <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>)
    {
        treap_left <span style="color:#f92672">=</span> NULL;
        treap_right <span style="color:#f92672">=</span> root;
    }
    <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (cut_left <span style="color:#f92672">==</span> treap_size(root))
    {
        treap_left <span style="color:#f92672">=</span> root;
        treap_right <span style="color:#f92672">=</span> NULL;
    }
    <span style="color:#66d9ef">if</span> (root <span style="color:#f92672">==</span> NULL)
    {
        treap_left <span style="color:#f92672">=</span> NULL;
        treap_right <span style="color:#f92672">=</span> NULL;
        <span style="color:#66d9ef">return</span>;
    }
    <span style="color:#66d9ef">else</span>
    {
        treap_down(root);
        <span style="color:#66d9ef">if</span> (treap_size(root<span style="color:#f92672">-&gt;</span>l_child) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">&lt;=</span> cut_left)
        {
            treap_left <span style="color:#f92672">=</span> root;
            treap_cut(root<span style="color:#f92672">-&gt;</span>r_child, treap_left<span style="color:#f92672">-&gt;</span>r_child, treap_right, cut_left <span style="color:#f92672">-</span> treap_size(root<span style="color:#f92672">-&gt;</span>l_child) <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>);
            <span style="color:#66d9ef">if</span> (treap_left<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL)
            {
                treap_left<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> treap_left;
            }
            treap_update(treap_left);
        }
        <span style="color:#66d9ef">else</span>
        {
            treap_right <span style="color:#f92672">=</span> root;
            treap_cut(root<span style="color:#f92672">-&gt;</span>l_child, treap_left, treap_right<span style="color:#f92672">-&gt;</span>l_child, cut_left);
            <span style="color:#66d9ef">if</span> (treap_right<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL)
            {
                treap_right<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> treap_right;
            }
            treap_update(treap_right);
        }
    }
}

treap_node <span style="color:#f92672">*</span><span style="color:#a6e22e">treap_merge</span>(treap_node <span style="color:#f92672">*</span>merge_left, treap_node <span style="color:#f92672">*</span>merge_right)
{
    <span style="color:#66d9ef">if</span> (merge_left <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span> merge_right;
    }
    <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (merge_right <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span> merge_left;
    }
    treap_node <span style="color:#f92672">*</span>ret <span style="color:#f92672">=</span> NULL;
    <span style="color:#66d9ef">if</span> (merge_left<span style="color:#f92672">-&gt;</span>rank <span style="color:#f92672">&lt;</span> merge_right<span style="color:#f92672">-&gt;</span>rank)
    {
        ret <span style="color:#f92672">=</span> merge_left;
        treap_down(ret);
        attach_as_r_child(ret, treap_merge(ret<span style="color:#f92672">-&gt;</span>r_child, merge_right));
    }
    <span style="color:#66d9ef">else</span>
    {
        ret <span style="color:#f92672">=</span> merge_right;
        treap_down(ret);
        attach_as_l_child(ret, treap_merge(merge_left, ret<span style="color:#f92672">-&gt;</span>l_child));
    }
    treap_update(ret);
    <span style="color:#66d9ef">return</span> ret;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">treap_route</span>(treap_node <span style="color:#f92672">*</span>v)
{
    <span style="color:#66d9ef">while</span> ((v<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">!=</span> NULL) <span style="color:#f92672">&amp;&amp;</span> (v<span style="color:#f92672">-&gt;</span>rank <span style="color:#f92672">&lt;</span> v<span style="color:#f92672">-&gt;</span>parent<span style="color:#f92672">-&gt;</span>rank))
    {
        <span style="color:#66d9ef">if</span> (v<span style="color:#f92672">-&gt;</span>parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> v)
        {
            zig(v<span style="color:#f92672">-&gt;</span>parent);
        }
        <span style="color:#66d9ef">else</span>
        {
            zag(v<span style="color:#f92672">-&gt;</span>parent);
        }
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">treap_insert</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> n)
{
    treap_node <span style="color:#f92672">*</span>v <span style="color:#f92672">=</span> NULL;
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;=</span> n; i<span style="color:#f92672">++</span>)
    {
        treap_node <span style="color:#f92672">*</span>insert_node <span style="color:#f92672">=</span> new_node(i);
        <span style="color:#66d9ef">if</span> (v <span style="color:#f92672">==</span> NULL)
        {
            head <span style="color:#f92672">=</span> insert_node;
        }
        <span style="color:#66d9ef">else</span>
        {
            attach_as_r_child(v, insert_node);
            treap_insert_size(v);
            treap_route(insert_node);
        }
        v <span style="color:#f92672">=</span> insert_node;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">treap_reverse</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> l, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> r)
{
    treap_node <span style="color:#f92672">*</span>treap_l <span style="color:#f92672">=</span> NULL, <span style="color:#f92672">*</span>treap_r <span style="color:#f92672">=</span> NULL, <span style="color:#f92672">*</span>treap_reverse <span style="color:#f92672">=</span> NULL;
    treap_cut(head, treap_l, treap_r, l <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>);
    treap_cut(treap_r, treap_reverse, treap_r, r <span style="color:#f92672">-</span> l <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>);
    treap_swap(treap_reverse);
    treap_l <span style="color:#f92672">=</span> treap_merge(treap_l, treap_reverse);
    head <span style="color:#f92672">=</span> treap_merge(treap_l, treap_r);
    head<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> NULL;
}

<span style="color:#66d9ef">void</span> <span style="color:#a6e22e">treap_print</span>(treap_node <span style="color:#f92672">*</span>root)
{
    <span style="color:#66d9ef">if</span> (root <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span>;
    }
    treap_down(root);
    treap_print(root<span style="color:#f92672">-&gt;</span>l_child);
    printf(<span style="color:#e6db74">&#34;%d &#34;</span>, root<span style="color:#f92672">-&gt;</span>val);
    treap_print(root<span style="color:#f92672">-&gt;</span>r_child);
}

<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span><span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">treap_checker</span>(treap_node <span style="color:#f92672">*</span>root <span style="color:#f92672">=</span> head, <span style="color:#66d9ef">bool</span> down_swap <span style="color:#f92672">=</span> false)
{
    <span style="color:#66d9ef">if</span> (root <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span>;
    }
    <span style="color:#66d9ef">int</span> size <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">if</span> ((root<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL) <span style="color:#f92672">&amp;&amp;</span> (<span style="color:#f92672">!</span>down_swap))
    {
        <span style="color:#66d9ef">if</span> (root<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">!=</span> root)
        {
            printf(<span style="color:#e6db74">&#34;ERROR &#34;</span>);
        }
        <span style="color:#66d9ef">if</span> (root<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>rank <span style="color:#f92672">&lt;</span> root<span style="color:#f92672">-&gt;</span>rank)
        {
            printf(<span style="color:#e6db74">&#34;ERROR_RANK &#34;</span>);
        }
        treap_checker(root<span style="color:#f92672">-&gt;</span>l_child, down_swap <span style="color:#f92672">^</span> root<span style="color:#f92672">-&gt;</span>down_swap);
        size <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size;
    }
    <span style="color:#66d9ef">if</span> ((root<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL) <span style="color:#f92672">&amp;&amp;</span> down_swap)
    {
        <span style="color:#66d9ef">if</span> (root<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">!=</span> root)
        {
            printf(<span style="color:#e6db74">&#34;ERROR &#34;</span>);
        }
        <span style="color:#66d9ef">if</span> (root<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>rank <span style="color:#f92672">&lt;</span> root<span style="color:#f92672">-&gt;</span>rank)
        {
            printf(<span style="color:#e6db74">&#34;ERROR_RANK &#34;</span>);
        }
        treap_checker(root<span style="color:#f92672">-&gt;</span>r_child, down_swap <span style="color:#f92672">^</span> root<span style="color:#f92672">-&gt;</span>down_swap);
        size <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>size;
    }
    printf(<span style="color:#e6db74">&#34;%d &#34;</span>, root<span style="color:#f92672">-&gt;</span>val);
    <span style="color:#66d9ef">if</span> ((root<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL) <span style="color:#f92672">&amp;&amp;</span> down_swap)
    {
        <span style="color:#66d9ef">if</span> (root<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">!=</span> root)
        {
            printf(<span style="color:#e6db74">&#34;ERROR &#34;</span>);
        }
        <span style="color:#66d9ef">if</span> (root<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>rank <span style="color:#f92672">&lt;</span> root<span style="color:#f92672">-&gt;</span>rank)
        {
            printf(<span style="color:#e6db74">&#34;ERROR_RANK &#34;</span>);
        }
        treap_checker(root<span style="color:#f92672">-&gt;</span>l_child, down_swap <span style="color:#f92672">^</span> root<span style="color:#f92672">-&gt;</span>down_swap);
        size <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size;
    }
    <span style="color:#66d9ef">if</span> ((root<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL) <span style="color:#f92672">&amp;&amp;</span> (<span style="color:#f92672">!</span>down_swap))
    {
        <span style="color:#66d9ef">if</span> (root<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">!=</span> root)
        {
            printf(<span style="color:#e6db74">&#34;ERROR &#34;</span>);
        }
        <span style="color:#66d9ef">if</span> (root<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>rank <span style="color:#f92672">&lt;</span> root<span style="color:#f92672">-&gt;</span>rank)
        {
            printf(<span style="color:#e6db74">&#34;ERROR_RANK &#34;</span>);
        }
        treap_checker(root<span style="color:#f92672">-&gt;</span>r_child, down_swap <span style="color:#f92672">^</span> root<span style="color:#f92672">-&gt;</span>down_swap);
        size <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>size;
    }
    <span style="color:#66d9ef">if</span> (size <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">!=</span> root<span style="color:#f92672">-&gt;</span>size)
    {
        printf(<span style="color:#e6db74">&#34;E %d ERROR_SIZE &#34;</span>, root<span style="color:#f92672">-&gt;</span>val);
    }
}
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span><span style="color:#75715e">/*---treap---*/</span>

<span style="color:#66d9ef">int</span> n, m;
<span style="color:#66d9ef">int</span> rec_l, rec_r;

<span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    ll start_time_ <span style="color:#f92672">=</span> clock();
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;3223.in&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>, stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;3223.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>    <span style="color:#75715e">//fread(fread_string, 1, MAXS, stdin);
</span><span style="color:#75715e"></span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    srand(rand_base);
    init_memory();
    read(n);
    read(m);
    treap_insert(n);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>    treap_checker();
    printf(<span style="color:#e6db74">&#34;n&#34;</span>);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> m; i<span style="color:#f92672">++</span>)
    {
        read(rec_l);
        read(rec_r);
        treap_reverse(rec_l, rec_r);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>        treap_checker();
        printf(<span style="color:#e6db74">&#34;n&#34;</span>);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    }
    treap_print(head);
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    printf(<span style="color:#e6db74">&#34;nrun time: %lld msn&#34;</span>, clock() <span style="color:#f92672">-</span> start_time_);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    fclose(stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>    fclose(stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
}
</code></pre></div>]]></content></item><item><title>[BZOJ3223][TYVJ1728]普通平衡树（FANHQ_TREAP）</title><link>https://www.sxn.dev/posts/tyvj1728/</link><pubDate>Fri, 02 May 2014 19:47:13 +0000</pubDate><guid>https://www.sxn.dev/posts/tyvj1728/</guid><description>&lt;p>这道题就是裸裸的TREAP，然后TREAP的裸题好像已经写过了，于是决定试试写FANHQ TREAP，一开始我插入没写旋转，后来仔细研究了FANHQ的博客，才知道后来他加了旋转（说好的没有旋转呢），然后我去加了旋转果断快了50ms&lt;/p></description><content type="html"><![CDATA[<p>这道题就是裸裸的TREAP，然后TREAP的裸题好像已经写过了，于是决定试试写FANHQ TREAP，一开始我插入没写旋转，后来仔细研究了FANHQ的博客，才知道后来他加了旋转（说好的没有旋转呢），然后我去加了旋转果断快了50ms</p>
<p>关于FANHQ TREAP，当然是去看FANHQ在WC上讲课的材料和FANHQ的博客咯：
<a href="http://shenxn-others.qiniudn.com/%E8%8C%83%E6%B5%A9%E5%BC%BA_wc2012%E8%B0%88%E8%B0%88%E5%90%84%E7%A7%8D%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84.pdf" title="范浩强_wc2012谈谈各种数据结构.pdf">范浩强_wc2012谈谈各种数据结构.pdf</a>   <a href="http://3.shenxn.sinaapp.com/pdfreader/web/viewer.php?url=http://shenxn-others.qiniudn.com/%E8%8C%83%E6%B5%A9%E5%BC%BA_wc2012%E8%B0%88%E8%B0%88%E5%90%84%E7%A7%8D%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84.pdf" title="范浩强_wc2012谈谈各种数据结构.pdf">在线预览</a>
<a href="http://fanhq666.blog.163.com/blog/static/819434262011021105212299/" title="挖掘Treap的潜力- fanhq666的日志- 网易博客">挖掘Treap的潜力- fanhq666的日志- 网易博客</a></p>
<p>然后贴上我的程序，貌似不算快</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#75715e">//BZOJ 3224.cpp fanhq_treap
</span><span style="color:#75715e"></span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;algorithm&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;iostream&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstring&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdlib&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdio&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;string&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cmath&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;queue&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;stack&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span>
<span style="color:#75715e">//#define LOCAL
</span><span style="color:#75715e">//#define VISUAL_STUDIO
</span><span style="color:#75715e"></span><span style="color:#75715e">#define READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define READ_FILE
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef VISUAL_STUDIO
</span><span style="color:#75715e">#pragma warning(disable:4996)
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL
</span><span style="color:#75715e">#define LOCAL_TIME
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define DEBUG_DETAIL
</span><span style="color:#75715e">//#define DEBUG_ID
</span><span style="color:#75715e">//#define DEBUG_SIZE
</span><span style="color:#75715e">//#define LOCAL_DEBUG
</span><span style="color:#75715e">//#define STD_DEBUG
</span><span style="color:#75715e"></span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;ctime&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXS <span style="color:#f92672">=</span> <span style="color:#ae81ff">10</span> <span style="color:#f92672">*</span> <span style="color:#ae81ff">1024</span> <span style="color:#f92672">*</span> <span style="color:#ae81ff">1024</span>;

<span style="color:#66d9ef">char</span> fread_string[MAXS];
<span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>fread_point <span style="color:#f92672">=</span> fread_string;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">get_int</span>()
{
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">int</span> sign <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
    <span style="color:#66d9ef">while</span> ((<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">&lt;</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">||</span> (<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">&gt;</span> <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        sign <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
        <span style="color:#66d9ef">if</span> (<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;-&#39;</span>)
        {
            sign <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
        }
        fread_point<span style="color:#f92672">++</span>;
    }
    <span style="color:#66d9ef">while</span> ((<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">&gt;=</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">&lt;=</span> <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        ret <span style="color:#f92672">=</span> ret <span style="color:#f92672">*</span> <span style="color:#ae81ff">10</span> <span style="color:#f92672">+</span> <span style="color:#f92672">*</span>(fread_point<span style="color:#f92672">++</span>) <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;0&#39;</span>;
    }
    <span style="color:#66d9ef">return</span> sign <span style="color:#f92672">*</span> ret;
}
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">read</span>(<span style="color:#66d9ef">int</span> <span style="color:#f92672">&amp;</span>input_num)
{
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>    input_num <span style="color:#f92672">=</span> get_int();
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>    scanf(<span style="color:#e6db74">&#34;%d&#34;</span>, <span style="color:#f92672">&amp;</span>input_num);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#66d9ef">typedef</span> <span style="color:#66d9ef">long</span> <span style="color:#66d9ef">long</span> ll;

<span style="color:#75715e">/*---rank---*/</span>
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> rank_base <span style="color:#f92672">=</span> <span style="color:#ae81ff">1753</span>;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">get_rank</span>()
{
    <span style="color:#66d9ef">return</span> (rand() <span style="color:#f92672">&lt;&lt;</span> <span style="color:#ae81ff">11</span>) <span style="color:#f92672">+</span> rand();
}
<span style="color:#75715e">/*---rank---*/</span>

<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">treap_node</span>
{
    <span style="color:#66d9ef">int</span> val, rank, size;
    treap_node <span style="color:#f92672">*</span>l_child, <span style="color:#f92672">*</span>r_child, <span style="color:#f92672">*</span>parent;
    <span style="color:#66d9ef">inline</span> treap_node <span style="color:#f92672">*</span><span style="color:#a6e22e">init</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val_ <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>, treap_node <span style="color:#f92672">*</span>l_child_ <span style="color:#f92672">=</span> NULL, treap_node <span style="color:#f92672">*</span>r_child_ <span style="color:#f92672">=</span> NULL, treap_node <span style="color:#f92672">*</span>parent_ <span style="color:#f92672">=</span> NULL)
    {
        val <span style="color:#f92672">=</span> val_;
        size <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
        l_child <span style="color:#f92672">=</span> l_child_;
        r_child <span style="color:#f92672">=</span> r_child_;
        parent <span style="color:#f92672">=</span> parent_;
        <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">this</span>;
    }
    <span style="color:#66d9ef">inline</span> <span style="color:#a6e22e">treap_node</span>()
    {
        init();
    }
};

<span style="color:#75715e">#ifndef NULL
</span><span style="color:#75715e">#define NULL 0
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">/*---recover memory---*/</span>
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXN <span style="color:#f92672">=</span> <span style="color:#ae81ff">100000</span>;

treap_node node_memory[MAXN];
treap_node <span style="color:#f92672">*</span>memory_stack[MAXN];
<span style="color:#66d9ef">int</span> treap_top <span style="color:#f92672">=</span> MAXN;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">init_memory</span>()
{
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> MAXN; i<span style="color:#f92672">++</span>)
    {
        memory_stack[i] <span style="color:#f92672">=</span> node_memory <span style="color:#f92672">+</span> i;
        node_memory[i].rank <span style="color:#f92672">=</span> get_rank();
    }
}

<span style="color:#66d9ef">inline</span> treap_node <span style="color:#f92672">*</span><span style="color:#a6e22e">new_node</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>, treap_node <span style="color:#f92672">*</span>l_child <span style="color:#f92672">=</span> NULL, treap_node <span style="color:#f92672">*</span>r_child <span style="color:#f92672">=</span> NULL, treap_node <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> NULL)
{
    <span style="color:#66d9ef">return</span> memory_stack[<span style="color:#f92672">--</span>treap_top]<span style="color:#f92672">-&gt;</span>init(val, l_child, r_child, parent);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">delete_node</span>(treap_node <span style="color:#f92672">*</span>del_node)
{
    memory_stack[treap_top<span style="color:#f92672">++</span>] <span style="color:#f92672">=</span> del_node;
    del_node<span style="color:#f92672">-&gt;</span>init();
}
<span style="color:#75715e">/*---recover memory---*/</span>

treap_node <span style="color:#f92672">*</span>head;

<span style="color:#75715e">/*---treap---*/</span>
<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">attach_as_l_child</span>(treap_node <span style="color:#f92672">*</span>parent, treap_node <span style="color:#f92672">*</span>child)
{
    parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> child;
    <span style="color:#66d9ef">if</span> (child <span style="color:#f92672">!=</span> NULL)
    {
        child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">attach_as_r_child</span>(treap_node <span style="color:#f92672">*</span>parent, treap_node <span style="color:#f92672">*</span>child)
{
    parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> child;
    <span style="color:#66d9ef">if</span> (child <span style="color:#f92672">!=</span> NULL)
    {
        child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">treap_size</span>(treap_node <span style="color:#f92672">*</span>size_node)
{
    <span style="color:#66d9ef">if</span> (size_node <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
    }
    <span style="color:#66d9ef">return</span> size_node<span style="color:#f92672">-&gt;</span>size;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">treap_update_size</span>(treap_node <span style="color:#f92672">*</span>update_node)
{
    update_node<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> treap_size(update_node<span style="color:#f92672">-&gt;</span>l_child) <span style="color:#f92672">+</span> treap_size(update_node<span style="color:#f92672">-&gt;</span>r_child) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">treap_update</span>(treap_node <span style="color:#f92672">*</span>update_node)
{
    treap_update_size(update_node);
}

treap_node <span style="color:#f92672">*</span><span style="color:#a6e22e">treap_merge</span>(treap_node <span style="color:#f92672">*</span>merge_left, treap_node <span style="color:#f92672">*</span>merge_right)
{
    <span style="color:#66d9ef">if</span> ((merge_left <span style="color:#f92672">==</span> NULL) <span style="color:#f92672">&amp;&amp;</span> (merge_right <span style="color:#f92672">==</span> NULL))
    {
        <span style="color:#66d9ef">return</span> NULL;
    }
    <span style="color:#66d9ef">if</span> (merge_left <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span> merge_right;
    }
    <span style="color:#66d9ef">if</span> (merge_right <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span> merge_left;
    }
    <span style="color:#66d9ef">if</span> (merge_left<span style="color:#f92672">-&gt;</span>rank <span style="color:#f92672">&lt;</span> merge_right<span style="color:#f92672">-&gt;</span>rank)
    {
        attach_as_r_child(merge_left, treap_merge(merge_left<span style="color:#f92672">-&gt;</span>r_child, merge_right));
        treap_update(merge_left);
        <span style="color:#66d9ef">return</span> merge_left;
    }
    <span style="color:#66d9ef">else</span>
    {
        attach_as_l_child(merge_right, treap_merge(merge_left, merge_right<span style="color:#f92672">-&gt;</span>l_child));
        treap_update(merge_right);
        <span style="color:#66d9ef">return</span> merge_right;
    }
    <span style="color:#66d9ef">return</span> NULL;
}

<span style="color:#66d9ef">inline</span> treap_node <span style="color:#f92672">*</span><span style="color:#a6e22e">treap_search_val</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> add_size <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>, <span style="color:#66d9ef">bool</span> get_same <span style="color:#f92672">=</span> true)
{
    treap_node <span style="color:#f92672">*</span>last_visit <span style="color:#f92672">=</span> head;
    treap_node <span style="color:#f92672">*</span>found <span style="color:#f92672">=</span> NULL;
    <span style="color:#66d9ef">for</span> (treap_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> head; tmp <span style="color:#f92672">!=</span> NULL;)
    {
        last_visit <span style="color:#f92672">=</span> tmp;
        <span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">==</span> val)
        {
            found <span style="color:#f92672">=</span> tmp;
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>l_child;
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">&lt;</span> val)
        {
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>r_child;
        }
        <span style="color:#66d9ef">else</span>
        {
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>l_child;
        }
    }
    <span style="color:#66d9ef">for</span> (treap_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> ((found <span style="color:#f92672">!=</span> NULL) <span style="color:#f92672">&amp;&amp;</span> get_same <span style="color:#f92672">?</span> found<span style="color:#f92672">-&gt;</span>parent : last_visit); tmp <span style="color:#f92672">!=</span> NULL; tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>parent)
    {
        tmp<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">+=</span> add_size;
    }
    <span style="color:#66d9ef">return</span> ((found <span style="color:#f92672">!=</span> NULL) <span style="color:#f92672">&amp;&amp;</span> get_same <span style="color:#f92672">?</span> found : last_visit);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zig</span>(treap_node <span style="color:#f92672">*</span>axis)
{

    treap_node <span style="color:#f92672">*</span>left_child <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>l_child;
    treap_node <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>parent;
    attach_as_l_child(axis, left_child<span style="color:#f92672">-&gt;</span>r_child);
    attach_as_r_child(left_child, axis);
    left_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    <span style="color:#66d9ef">if</span> (parent <span style="color:#f92672">==</span> NULL)
    {
        head <span style="color:#f92672">=</span> left_child;
    }
    <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> axis)
    {
        parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> left_child;
    }
    <span style="color:#66d9ef">else</span>
    {
        parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> left_child;
    }
    treap_update(axis);
    treap_update(left_child);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zag</span>(treap_node <span style="color:#f92672">*</span>axis)
{
    treap_node <span style="color:#f92672">*</span>right_child <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>r_child;
    treap_node <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>parent;
    attach_as_r_child(axis, right_child<span style="color:#f92672">-&gt;</span>l_child);
    attach_as_l_child(right_child, axis);
    right_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    <span style="color:#66d9ef">if</span> (parent <span style="color:#f92672">==</span> NULL)
    {
        head <span style="color:#f92672">=</span> right_child;
    }
    <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> axis)
    {
        parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> right_child;
    }
    <span style="color:#66d9ef">else</span>
    {
        parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> right_child;
    }
    treap_update(axis);
    treap_update(right_child);
}
<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">treap_route</span>(treap_node <span style="color:#f92672">*</span>route_node)
{
    <span style="color:#66d9ef">while</span> ((route_node<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">!=</span> NULL) <span style="color:#f92672">&amp;&amp;</span> (route_node<span style="color:#f92672">-&gt;</span>rank <span style="color:#f92672">&lt;</span> route_node<span style="color:#f92672">-&gt;</span>parent<span style="color:#f92672">-&gt;</span>rank))
    {
        <span style="color:#66d9ef">if</span> (route_node<span style="color:#f92672">-&gt;</span>parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> route_node)
        {
            zig(route_node<span style="color:#f92672">-&gt;</span>parent);
        }
        <span style="color:#66d9ef">else</span>
        {
            zag(route_node<span style="color:#f92672">-&gt;</span>parent);
        }
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">treap_insert</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
    treap_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> new_node(val);
    <span style="color:#66d9ef">if</span> (head <span style="color:#f92672">==</span> NULL)
    {
        head <span style="color:#f92672">=</span> tmp;
    }
    <span style="color:#66d9ef">else</span>
    {
        treap_node <span style="color:#f92672">*</span>insert_pt <span style="color:#f92672">=</span> treap_search_val(val, <span style="color:#ae81ff">1</span>, false);
        <span style="color:#66d9ef">if</span> (insert_pt<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">&lt;</span> val)
        {
            attach_as_r_child(insert_pt, tmp);
        }
        <span style="color:#66d9ef">else</span>
        {
            attach_as_l_child(insert_pt, tmp);
        }
        treap_route(insert_pt);
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">treap_delete</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
    treap_node <span style="color:#f92672">*</span>del_node <span style="color:#f92672">=</span> treap_search_val(val, <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>);
    treap_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> treap_merge(del_node<span style="color:#f92672">-&gt;</span>l_child, del_node<span style="color:#f92672">-&gt;</span>r_child);
    <span style="color:#66d9ef">if</span> (del_node<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">==</span> NULL)
    {
        head <span style="color:#f92672">=</span> tmp;
        tmp<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> NULL;
    }
    <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (del_node<span style="color:#f92672">-&gt;</span>parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> del_node)
    {
        attach_as_l_child(del_node<span style="color:#f92672">-&gt;</span>parent, tmp);
    }
    <span style="color:#66d9ef">else</span>
    {
        attach_as_r_child(del_node<span style="color:#f92672">-&gt;</span>parent, tmp);
    }
    delete_node(del_node);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">treap_rank</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
    <span style="color:#66d9ef">int</span> rank <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">for</span> (treap_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> head; tmp <span style="color:#f92672">!=</span> NULL;)
    {
        <span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">==</span> val)
        {
            ret <span style="color:#f92672">=</span> rank <span style="color:#f92672">+</span> treap_size(tmp<span style="color:#f92672">-&gt;</span>l_child) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>l_child;
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">&lt;</span> val)
        {
            rank <span style="color:#f92672">+=</span> treap_size(tmp<span style="color:#f92672">-&gt;</span>l_child) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>r_child;
        }
        <span style="color:#66d9ef">else</span>
        {
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>l_child;
        }
    }
    <span style="color:#66d9ef">return</span> ret;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">treap_num</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> rank)
{
    <span style="color:#66d9ef">int</span> size <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">for</span> (treap_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> head; tmp <span style="color:#f92672">!=</span> NULL;)
    {
        <span style="color:#66d9ef">if</span> (size <span style="color:#f92672">+</span> treap_size(tmp<span style="color:#f92672">-&gt;</span>l_child) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">==</span> rank)
        {
            <span style="color:#66d9ef">return</span> tmp<span style="color:#f92672">-&gt;</span>val;
        }
        <span style="color:#66d9ef">if</span> (size <span style="color:#f92672">+</span> treap_size(tmp<span style="color:#f92672">-&gt;</span>l_child) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">&lt;</span> rank)
        {
            size <span style="color:#f92672">+=</span> treap_size(tmp<span style="color:#f92672">-&gt;</span>l_child) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>r_child;
        }
        <span style="color:#66d9ef">else</span>
        {
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>l_child;
        }
    }
    <span style="color:#66d9ef">return</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">treap_prev</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
    <span style="color:#66d9ef">int</span> max <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
    <span style="color:#66d9ef">for</span> (treap_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> head; tmp <span style="color:#f92672">!=</span> NULL;)
    {
        <span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">&lt;</span> val)
        {
            <span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">&gt;</span> max)
            {
                max <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>val;
            }
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>r_child;
        }
        <span style="color:#66d9ef">else</span>
        {
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>l_child;
        }
    }
    <span style="color:#66d9ef">return</span> max;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">treap_next</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
    <span style="color:#66d9ef">int</span> min <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
    <span style="color:#66d9ef">for</span> (treap_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> head; tmp <span style="color:#f92672">!=</span> NULL;)
    {
        <span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">&gt;</span> val)
        {
            <span style="color:#66d9ef">if</span> ((min <span style="color:#f92672">==</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>) <span style="color:#f92672">||</span> (tmp<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">&lt;</span> min))
            {
                min <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>val;
            }
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>l_child;
        }
        <span style="color:#66d9ef">else</span>
        {
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>r_child;
        }
    }
    <span style="color:#66d9ef">return</span> min;
}

<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span><span style="color:#66d9ef">int</span> checker_prev <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">treap_checker</span>(treap_node <span style="color:#f92672">*</span>root <span style="color:#f92672">=</span> head)
{
    <span style="color:#66d9ef">if</span> (root <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span>;
    }
    <span style="color:#66d9ef">int</span> size <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">if</span> (root<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (root<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">!=</span> root)
        {
            printf(<span style="color:#e6db74">&#34;ERROR &#34;</span>);
        }
        treap_checker(root<span style="color:#f92672">-&gt;</span>l_child);
        size <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size;
    }
    printf(<span style="color:#e6db74">&#34;%d &#34;</span>, root<span style="color:#f92672">-&gt;</span>val);
    <span style="color:#66d9ef">if</span> (root<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">&lt;</span> checker_prev)
    {
        printf(<span style="color:#e6db74">&#34;ERROR_ORDER &#34;</span>);
    }
    checker_prev <span style="color:#f92672">=</span> root<span style="color:#f92672">-&gt;</span>val;
    <span style="color:#66d9ef">if</span> (root<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (root<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">!=</span> root)
        {
            printf(<span style="color:#e6db74">&#34;ERROR &#34;</span>);
        }
        treap_checker(root<span style="color:#f92672">-&gt;</span>r_child);
        size <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>size;
    }
    <span style="color:#66d9ef">if</span> (size <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">!=</span> root<span style="color:#f92672">-&gt;</span>size)
    {
        printf(<span style="color:#e6db74">&#34;E %d ERROR_SIZE &#34;</span>, root<span style="color:#f92672">-&gt;</span>val);
    }
}
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span><span style="color:#75715e">/*---treap---*/</span>

<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> OP_INS <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> OP_DEL <span style="color:#f92672">=</span> <span style="color:#ae81ff">2</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> OP_QRK <span style="color:#f92672">=</span> <span style="color:#ae81ff">3</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> OP_QNM <span style="color:#f92672">=</span> <span style="color:#ae81ff">4</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> OP_PRE <span style="color:#f92672">=</span> <span style="color:#ae81ff">5</span>;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> OP_NET <span style="color:#f92672">=</span> <span style="color:#ae81ff">6</span>;

<span style="color:#66d9ef">int</span> n;
<span style="color:#66d9ef">int</span> operator_num, x;

<span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    ll start_time_ <span style="color:#f92672">=</span> clock();
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;3224.in&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>, stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;3224_debug.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;3224.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>    fread(fread_string, <span style="color:#ae81ff">1</span>, MAXS, stdin);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    srand(rank_base);
    init_memory();
    read(n);
<span style="color:#75715e">#ifdef DEBUG_SIZE
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">int</span> size <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> n; i<span style="color:#f92672">++</span>)
    {
        read(operator_num);
        read(x);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>        printf(<span style="color:#e6db74">&#34;INPUT: %d %d %dn&#34;</span>, i, operator_num, x);
        <span style="color:#66d9ef">if</span> (i <span style="color:#f92672">==</span> <span style="color:#ae81ff">6</span>)
        {
            printf(<span style="color:#e6db74">&#34;DEBUG:6n&#34;</span>);
        }
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef DEBUG_DETAIL
</span><span style="color:#75715e"></span>        <span style="color:#66d9ef">if</span> (i <span style="color:#f92672">==</span> <span style="color:#ae81ff">3506</span>)
        {
            printf(<span style="color:#e6db74">&#34;DEBUG:3506n&#34;</span>);
        }
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef DEBUG_ID
</span><span style="color:#75715e"></span>        printf(<span style="color:#e6db74">&#34;%d &#34;</span>, i);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>        <span style="color:#66d9ef">if</span> (operator_num <span style="color:#f92672">==</span> OP_INS)
        {
<span style="color:#75715e">#ifdef DEBUG_SIZE
</span><span style="color:#75715e"></span>            size<span style="color:#f92672">++</span>;
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>            treap_insert(x);
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operator_num <span style="color:#f92672">==</span> OP_DEL)
        {
<span style="color:#75715e">#ifdef DEBUG_SIZE
</span><span style="color:#75715e"></span>            size<span style="color:#f92672">--</span>;
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>            treap_delete(x);
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operator_num <span style="color:#f92672">==</span> OP_QRK)
        {
            printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, treap_rank(x));
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operator_num <span style="color:#f92672">==</span> OP_QNM)
        {
            printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, treap_num(x));
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operator_num <span style="color:#f92672">==</span> OP_PRE)
        {
            printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, treap_prev(x));
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operator_num <span style="color:#f92672">==</span> OP_NET)
        {
            printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, treap_next(x));
        }
<span style="color:#75715e">#ifdef DEBUG_SIZE
</span><span style="color:#75715e"></span>        <span style="color:#66d9ef">if</span> (size <span style="color:#f92672">!=</span> head<span style="color:#f92672">-&gt;</span>size)
        {
            printf(<span style="color:#e6db74">&#34;ERROR!!n&#34;</span>);
        }
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>        checker_prev <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
        printf(<span style="color:#e6db74">&#34;DEBUG: &#34;</span>);
        treap_checker();
        printf(<span style="color:#e6db74">&#34;n&#34;</span>);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    }
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    printf(<span style="color:#e6db74">&#34;run time: %lld ms&#34;</span>, clock() <span style="color:#f92672">-</span> start_time_);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    fclose(stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>    fclose(stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
}
</code></pre></div>]]></content></item><item><title>[BZOJ1500][NOI2005]维修数列（SPLAY）</title><link>https://www.sxn.dev/posts/noi2005-sequence/</link><pubDate>Fri, 02 May 2014 19:34:56 +0000</pubDate><guid>https://www.sxn.dev/posts/noi2005-sequence/</guid><description>&lt;p>好像已经写了好多SPLAY了，维修数列说是最重口味的SPLAY题目了，好吧我也调了将近一上午，主要是最大子段和的地方自己YY错了，少考虑了一种情况。。&lt;/p></description><content type="html"><![CDATA[<p>好像已经写了好多SPLAY了，维修数列说是最重口味的SPLAY题目了，好吧我也调了将近一上午，主要是最大子段和的地方自己YY错了，少考虑了一种情况。。</p>
<p>其他操作都很水，然后最大子段和就是要维护max_l, max_r, max_sum分别表示左起最大子段和、右起最大子段和、最大子段和。在叶节点上显然max_l = max_r = max_sum = value。UPDATE的公式是：
max_l = max(l_child-&gt;max_l, l_child-&gt;sum + value, l_child-&gt;sum + value + r_child-&gt;l_child);
max_r = max(r_child-&gt;max_r, r_child-&gt;sum + value,  r_child-&gt;sum + value + l_child-&gt;r_child);
max_sum = max(max_l, max_r, l_child-&gt;max_sum, r_child-&gt;max_sum, max(l_child-&gt;max_r, 0) + value + max(r_child-&gt;max_l, 0));</p>
<p>剩下的就是代码了（下面还有个暴力不要介意。。）</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#75715e">//NOI2005 DAY1 sequence.cpp splay
</span><span style="color:#75715e"></span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;algorithm&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;iostream&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstring&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdio&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;string&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cmath&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;queue&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;stack&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span>
<span style="color:#75715e">//#define VISUAL_STUDIO
</span><span style="color:#75715e"></span><span style="color:#75715e">#define READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define READ_FILE
</span><span style="color:#75715e">//#define LOCAL
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef VISUAL_STUDIO
</span><span style="color:#75715e">#pragma warning(disable:4996)
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define LOCAL_DEBUG
</span><span style="color:#75715e"></span><span style="color:#75715e">#define LOCAL_TIME
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define DEBUG_STD
</span><span style="color:#75715e"></span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define HARD_WORK
</span><span style="color:#75715e"></span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifndef HARD_WORK
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;ctime&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifndef NULL
</span><span style="color:#75715e">#define NULL 0
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXS <span style="color:#f92672">=</span> <span style="color:#ae81ff">13</span> <span style="color:#f92672">*</span> <span style="color:#ae81ff">1024</span> <span style="color:#f92672">*</span> <span style="color:#ae81ff">1024</span>;

<span style="color:#66d9ef">char</span> fread_string[MAXS];
<span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>fread_point <span style="color:#f92672">=</span> fread_string;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">get_int</span>()
{
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">int</span> sign <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
    <span style="color:#66d9ef">while</span> ((<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">&lt;</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">||</span> (<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">&gt;</span> <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        sign <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
        <span style="color:#66d9ef">if</span> (<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;-&#39;</span>)
        {
            sign <span style="color:#f92672">=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
        }
        fread_point<span style="color:#f92672">++</span>;
    }
    <span style="color:#66d9ef">while</span> ((<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">&gt;=</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">&lt;=</span> <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        ret <span style="color:#f92672">=</span> ret <span style="color:#f92672">*</span> <span style="color:#ae81ff">10</span> <span style="color:#f92672">+</span> <span style="color:#f92672">*</span>(fread_point<span style="color:#f92672">++</span>) <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;0&#39;</span>;
    }
    <span style="color:#66d9ef">return</span> sign <span style="color:#f92672">*</span> ret;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">get_string</span>(<span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>input_string)
{
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>    memset(input_string, <span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">10</span>);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">while</span> ((<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39; &#39;</span>) <span style="color:#f92672">||</span> (<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;n&#39;</span>))
    {
        fread_point<span style="color:#f92672">++</span>;
    }
    <span style="color:#66d9ef">int</span> length <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">while</span> ((<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">!=</span> <span style="color:#e6db74">&#39; &#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">!=</span> <span style="color:#e6db74">&#39;n&#39;</span>))
    {
        input_string[length<span style="color:#f92672">++</span>] <span style="color:#f92672">=</span> <span style="color:#f92672">*</span>(fread_point<span style="color:#f92672">++</span>);
    }
}
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">read</span>(<span style="color:#66d9ef">int</span> <span style="color:#f92672">*</span>read_num)
{
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>    <span style="color:#f92672">*</span>read_num <span style="color:#f92672">=</span> get_int();
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>    scanf(<span style="color:#e6db74">&#34;%d&#34;</span>, read_num);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">read</span>(<span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>read_string)
{
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>    get_string(read_string);
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>    scanf(<span style="color:#e6db74">&#34;%s&#34;</span>, read_string);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#66d9ef">typedef</span> <span style="color:#66d9ef">long</span> <span style="color:#66d9ef">long</span> ll;

<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">splay_node</span>
{
    <span style="color:#66d9ef">int</span> val;
    splay_node <span style="color:#f92672">*</span>parent, <span style="color:#f92672">*</span>l_child, <span style="color:#f92672">*</span>r_child;
    <span style="color:#66d9ef">int</span> sum, max_l, max_r, max_sum, size;
    <span style="color:#66d9ef">bool</span> down_swap, down_change;
    <span style="color:#66d9ef">int</span> change_num;
    <span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">init</span>()
    {
        val <span style="color:#f92672">=</span> sum <span style="color:#f92672">=</span> max_l <span style="color:#f92672">=</span> max_r <span style="color:#f92672">=</span> max_sum <span style="color:#f92672">=</span> size <span style="color:#f92672">=</span> change_num <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
        parent <span style="color:#f92672">=</span> l_child <span style="color:#f92672">=</span> r_child <span style="color:#f92672">=</span> NULL;
        down_swap <span style="color:#f92672">=</span> down_change <span style="color:#f92672">=</span> false;
    }
    <span style="color:#66d9ef">inline</span> <span style="color:#a6e22e">splay_node</span>()
    {
        init();
    }
    <span style="color:#66d9ef">inline</span> <span style="color:#f92672">~</span>splay_node()
    {
    }
};

<span style="color:#75715e">/*---recover memory---*/</span>
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXN <span style="color:#f92672">=</span> <span style="color:#ae81ff">500000</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">10</span>;

splay_node node_memory[MAXN];
splay_node <span style="color:#f92672">*</span>memory_stack[MAXN];
<span style="color:#66d9ef">int</span> top_stack;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">init_memory</span>()
{
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> MAXN; i<span style="color:#f92672">++</span>)
    {
        memory_stack[i] <span style="color:#f92672">=</span> node_memory <span style="color:#f92672">+</span> i;
    }
    top_stack <span style="color:#f92672">=</span> MAXN;
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">new_node</span>()
{
    <span style="color:#66d9ef">return</span> memory_stack[<span style="color:#f92672">--</span>top_stack];
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">delete_node</span>(splay_node <span style="color:#f92672">*</span>del_node)
{
    memory_stack[top_stack<span style="color:#f92672">++</span>] <span style="color:#f92672">=</span> del_node;
    del_node<span style="color:#f92672">-&gt;</span>init();
}
<span style="color:#75715e">/*---recover memory---*/</span>

<span style="color:#66d9ef">int</span> n, m;
<span style="color:#66d9ef">int</span> insert_num[MAXN];

splay_node <span style="color:#f92672">*</span>head <span style="color:#f92672">=</span> NULL;

<span style="color:#75715e">/*---splay---*/</span>
<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">attach_as_l_child</span>(splay_node <span style="color:#f92672">*</span>parent, splay_node <span style="color:#f92672">*</span>child)
{
    parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> child;
    <span style="color:#66d9ef">if</span> (child <span style="color:#f92672">!=</span> NULL)
    {
        child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">attach_as_r_child</span>(splay_node <span style="color:#f92672">*</span>parent, splay_node <span style="color:#f92672">*</span>child)
{
    parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> child;
    <span style="color:#66d9ef">if</span> (child <span style="color:#f92672">!=</span> NULL)
    {
        child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_update_max</span>(splay_node <span style="color:#f92672">*</span>update_node)
{
    <span style="color:#66d9ef">if</span> ((update_node<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL) <span style="color:#f92672">&amp;&amp;</span> (update_node<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL))
    {
        update_node<span style="color:#f92672">-&gt;</span>max_l <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(update_node<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>max_l, update_node<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>sum <span style="color:#f92672">+</span> update_node<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">+</span> (update_node<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>max_l <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span> <span style="color:#f92672">?</span> update_node<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>max_l : <span style="color:#ae81ff">0</span>));
        update_node<span style="color:#f92672">-&gt;</span>max_r <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(update_node<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>max_r, update_node<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>sum <span style="color:#f92672">+</span> update_node<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">+</span> (update_node<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>max_r <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span> <span style="color:#f92672">?</span> update_node<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>max_r : <span style="color:#ae81ff">0</span>));
        update_node<span style="color:#f92672">-&gt;</span>max_sum <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(update_node<span style="color:#f92672">-&gt;</span>max_l, update_node<span style="color:#f92672">-&gt;</span>max_r);
        update_node<span style="color:#f92672">-&gt;</span>max_sum <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(update_node<span style="color:#f92672">-&gt;</span>max_sum, update_node<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>max_sum);
        update_node<span style="color:#f92672">-&gt;</span>max_sum <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(update_node<span style="color:#f92672">-&gt;</span>max_sum, update_node<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>max_sum);
        update_node<span style="color:#f92672">-&gt;</span>max_sum <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(update_node<span style="color:#f92672">-&gt;</span>max_sum, (update_node<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>max_r <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span> <span style="color:#f92672">?</span> update_node<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>max_r : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> update_node<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">+</span> (update_node<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>max_l <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span> <span style="color:#f92672">?</span> update_node<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>max_l : <span style="color:#ae81ff">0</span>));
    }
    <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (update_node<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL)
    {
        update_node<span style="color:#f92672">-&gt;</span>max_l <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(update_node<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>max_l, update_node<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>sum <span style="color:#f92672">+</span> update_node<span style="color:#f92672">-&gt;</span>val);
        update_node<span style="color:#f92672">-&gt;</span>max_r <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(update_node<span style="color:#f92672">-&gt;</span>val, update_node<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>max_r <span style="color:#f92672">+</span> update_node<span style="color:#f92672">-&gt;</span>val);
        update_node<span style="color:#f92672">-&gt;</span>max_sum <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(update_node<span style="color:#f92672">-&gt;</span>max_l, update_node<span style="color:#f92672">-&gt;</span>max_r);
        update_node<span style="color:#f92672">-&gt;</span>max_sum <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(update_node<span style="color:#f92672">-&gt;</span>max_sum, update_node<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>max_sum);
        update_node<span style="color:#f92672">-&gt;</span>max_sum <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(update_node<span style="color:#f92672">-&gt;</span>max_sum, update_node<span style="color:#f92672">-&gt;</span>val);
    }
    <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (update_node<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL)
    {
        update_node<span style="color:#f92672">-&gt;</span>max_l <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(update_node<span style="color:#f92672">-&gt;</span>val, update_node<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>max_l <span style="color:#f92672">+</span> update_node<span style="color:#f92672">-&gt;</span>val);
        update_node<span style="color:#f92672">-&gt;</span>max_r <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(update_node<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>max_r, update_node<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>sum <span style="color:#f92672">+</span> update_node<span style="color:#f92672">-&gt;</span>val);
        update_node<span style="color:#f92672">-&gt;</span>max_sum <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(update_node<span style="color:#f92672">-&gt;</span>max_l, update_node<span style="color:#f92672">-&gt;</span>max_r);
        update_node<span style="color:#f92672">-&gt;</span>max_sum <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(update_node<span style="color:#f92672">-&gt;</span>max_sum, update_node<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>max_sum);
        update_node<span style="color:#f92672">-&gt;</span>max_sum <span style="color:#f92672">=</span> std<span style="color:#f92672">::</span>max(update_node<span style="color:#f92672">-&gt;</span>max_sum, update_node<span style="color:#f92672">-&gt;</span>val);
    }
    <span style="color:#66d9ef">else</span>
    {
        update_node<span style="color:#f92672">-&gt;</span>max_l <span style="color:#f92672">=</span> update_node<span style="color:#f92672">-&gt;</span>max_r <span style="color:#f92672">=</span> update_node<span style="color:#f92672">-&gt;</span>max_sum <span style="color:#f92672">=</span> update_node<span style="color:#f92672">-&gt;</span>val;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zig</span>(splay_node <span style="color:#f92672">*</span>axis)
{
    splay_node <span style="color:#f92672">*</span>left_child <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>l_child;
    splay_node <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>parent;
    attach_as_l_child(axis, left_child<span style="color:#f92672">-&gt;</span>r_child);
    attach_as_r_child(left_child, axis);
    left_child<span style="color:#f92672">-&gt;</span>sum <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>sum;
    axis<span style="color:#f92672">-&gt;</span>sum <span style="color:#f92672">=</span> (axis<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> axis<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>sum : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> (axis<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> axis<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>sum : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> axis<span style="color:#f92672">-&gt;</span>val;
    left_child<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>size;
    axis<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> (axis<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> axis<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> (axis<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> axis<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
    splay_update_max(axis);
    splay_update_max(left_child);
    left_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    <span style="color:#66d9ef">if</span> (parent <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> axis)
        {
            parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> left_child;
        }
        <span style="color:#66d9ef">else</span>
        {
            parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> left_child;
        }
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zag</span>(splay_node <span style="color:#f92672">*</span>axis)
{
    splay_node <span style="color:#f92672">*</span>right_child <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>r_child;
    splay_node <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>parent;
    attach_as_r_child(axis, right_child<span style="color:#f92672">-&gt;</span>l_child);
    attach_as_l_child(right_child, axis);
    right_child<span style="color:#f92672">-&gt;</span>sum <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>sum;
    axis<span style="color:#f92672">-&gt;</span>sum <span style="color:#f92672">=</span> (axis<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> axis<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>sum : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> (axis<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> axis<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>sum : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> axis<span style="color:#f92672">-&gt;</span>val;
    right_child<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>size;
    axis<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> (axis<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> axis<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> (axis<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> axis<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
    splay_update_max(axis);
    splay_update_max(right_child);
    right_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    <span style="color:#66d9ef">if</span> (parent <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> axis)
        {
            parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> right_child;
        }
        <span style="color:#66d9ef">else</span>
        {
            parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> right_child;
        }
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zig_zig</span>(splay_node <span style="color:#f92672">*</span>axis)
{
    zig(axis<span style="color:#f92672">-&gt;</span>l_child);
    zig(axis);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zig_zag</span>(splay_node <span style="color:#f92672">*</span>axis)
{
    zig(axis<span style="color:#f92672">-&gt;</span>r_child);
    zag(axis);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zag_zag</span>(splay_node <span style="color:#f92672">*</span>axis)
{
    zag(axis<span style="color:#f92672">-&gt;</span>r_child);
    zag(axis);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zag_zig</span>(splay_node <span style="color:#f92672">*</span>axis)
{
    zag(axis<span style="color:#f92672">-&gt;</span>l_child);
    zig(axis);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_swap</span>(splay_node <span style="color:#f92672">*</span>swap_node)
{
    <span style="color:#66d9ef">if</span> (swap_node <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span>;
    }
    std<span style="color:#f92672">::</span>swap(swap_node<span style="color:#f92672">-&gt;</span>l_child, swap_node<span style="color:#f92672">-&gt;</span>r_child);
    std<span style="color:#f92672">::</span>swap(swap_node<span style="color:#f92672">-&gt;</span>max_l, swap_node<span style="color:#f92672">-&gt;</span>max_r);
    swap_node<span style="color:#f92672">-&gt;</span>down_swap <span style="color:#f92672">=</span> <span style="color:#f92672">!</span>swap_node<span style="color:#f92672">-&gt;</span>down_swap;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_down_swap</span>(splay_node <span style="color:#f92672">*</span>root)
{
    <span style="color:#66d9ef">if</span> (root<span style="color:#f92672">-&gt;</span>down_swap)
    {
        splay_swap(root<span style="color:#f92672">-&gt;</span>l_child);
        splay_swap(root<span style="color:#f92672">-&gt;</span>r_child);
        root<span style="color:#f92672">-&gt;</span>down_swap <span style="color:#f92672">=</span> <span style="color:#f92672">!</span>root<span style="color:#f92672">-&gt;</span>down_swap;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_change</span>(splay_node <span style="color:#f92672">*</span>change_node, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> chan_num)
{
    <span style="color:#66d9ef">if</span> (change_node <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span>;
    }
    change_node<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">=</span> chan_num;
    change_node<span style="color:#f92672">-&gt;</span>sum <span style="color:#f92672">=</span> change_node<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">*</span> chan_num;
    change_node<span style="color:#f92672">-&gt;</span>max_l <span style="color:#f92672">=</span> change_node<span style="color:#f92672">-&gt;</span>max_r <span style="color:#f92672">=</span> change_node<span style="color:#f92672">-&gt;</span>max_sum <span style="color:#f92672">=</span> (chan_num <span style="color:#f92672">&lt;</span> <span style="color:#ae81ff">0</span> <span style="color:#f92672">?</span> chan_num : change_node<span style="color:#f92672">-&gt;</span>sum);
    change_node<span style="color:#f92672">-&gt;</span>down_change <span style="color:#f92672">=</span> true;
    change_node<span style="color:#f92672">-&gt;</span>change_num <span style="color:#f92672">=</span> chan_num;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_down_change</span>(splay_node <span style="color:#f92672">*</span>root)
{
    <span style="color:#66d9ef">if</span> (root<span style="color:#f92672">-&gt;</span>down_change)
    {
        splay_change(root<span style="color:#f92672">-&gt;</span>l_child, root<span style="color:#f92672">-&gt;</span>change_num);
        splay_change(root<span style="color:#f92672">-&gt;</span>r_child, root<span style="color:#f92672">-&gt;</span>change_num);
        root<span style="color:#f92672">-&gt;</span>down_change <span style="color:#f92672">=</span> false;
    }
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_route</span>(splay_node <span style="color:#f92672">*</span>v)
{
    splay_node <span style="color:#f92672">*</span>parent, <span style="color:#f92672">*</span>grand_parent;
    <span style="color:#66d9ef">while</span> (((parent <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>parent) <span style="color:#f92672">!=</span> NULL) <span style="color:#f92672">&amp;&amp;</span> ((grand_parent <span style="color:#f92672">=</span> parent<span style="color:#f92672">-&gt;</span>parent) <span style="color:#f92672">!=</span> NULL))
    {
        splay_down_swap(grand_parent);
        splay_down_swap(parent);
        <span style="color:#75715e">//splay_down_swap(v);
</span><span style="color:#75715e"></span>        splay_down_change(grand_parent);
        splay_down_change(parent);
        <span style="color:#75715e">//splay_down_change(v);
</span><span style="color:#75715e"></span>        <span style="color:#66d9ef">if</span> (grand_parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> parent)
        {
            <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> v)
            {
                zig_zig(grand_parent);
            }
            <span style="color:#66d9ef">else</span>
            {
                zag_zig(grand_parent);
            }
        }
        <span style="color:#66d9ef">else</span>
        {
            <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">==</span> v)
            {
                zag_zag(grand_parent);
            }
            <span style="color:#66d9ef">else</span>
            {
                zig_zag(grand_parent);
            }
        }
    }
    <span style="color:#66d9ef">if</span> ((parent <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>parent) <span style="color:#f92672">!=</span> NULL)
    {
        splay_down_swap(parent);
        <span style="color:#75715e">//splay_down_swap(v);
</span><span style="color:#75715e"></span>        splay_down_change(parent);
        <span style="color:#75715e">//splay_down_change(v);
</span><span style="color:#75715e"></span>        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> v)
        {
            zig(parent);
        }
        <span style="color:#66d9ef">else</span>
        {
            zag(parent);
        }
    }
    <span style="color:#75715e">//splay_down_swap(v);
</span><span style="color:#75715e"></span>    <span style="color:#75715e">//splay_down_change(v);
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">return</span> v;
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_top</span>(splay_node <span style="color:#f92672">*</span>root <span style="color:#f92672">=</span> head)
{
    <span style="color:#66d9ef">for</span> (splay_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> root; tmp <span style="color:#f92672">!=</span> NULL; tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>l_child)
    {
        splay_down_swap(tmp);
        splay_down_change(tmp);
        <span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> NULL)
        {
            <span style="color:#66d9ef">return</span> tmp;
        }
    }
    <span style="color:#66d9ef">return</span> NULL;
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_bottom</span>(splay_node <span style="color:#f92672">*</span>root <span style="color:#f92672">=</span> head)
{
    <span style="color:#66d9ef">for</span> (splay_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> root; tmp <span style="color:#f92672">!=</span> NULL; tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>r_child)
    {
        splay_down_swap(tmp);
        splay_down_change(tmp);
        <span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">==</span> NULL)
        {
            <span style="color:#66d9ef">return</span> tmp;
        }
    }
    <span style="color:#66d9ef">return</span> NULL;
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_find</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> length, splay_node <span style="color:#f92672">*</span>root <span style="color:#f92672">=</span> head)
{
    <span style="color:#66d9ef">int</span> size <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">for</span> (splay_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> root; tmp <span style="color:#f92672">!=</span> NULL;)
    {
        splay_down_swap(tmp);
        splay_down_change(tmp);
        <span style="color:#66d9ef">if</span> (size <span style="color:#f92672">+</span> (tmp<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> tmp<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">==</span> length)
        {
            <span style="color:#66d9ef">return</span> tmp;
        }
        <span style="color:#66d9ef">if</span> (size <span style="color:#f92672">+</span> (tmp<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> tmp<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">&gt;</span> length)
        {
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>l_child;
        }
        <span style="color:#66d9ef">else</span>
        {
            size <span style="color:#f92672">+=</span> (tmp<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> tmp<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>r_child;
        }
    }
    <span style="color:#66d9ef">return</span> NULL;
}

splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_build</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> l, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> r)
{
    <span style="color:#66d9ef">int</span> mid <span style="color:#f92672">=</span> (l <span style="color:#f92672">+</span> r) <span style="color:#f92672">&gt;&gt;</span> <span style="color:#ae81ff">1</span>;
    splay_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> new_node();
    tmp<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">=</span> insert_num[mid];
    <span style="color:#66d9ef">if</span> (l <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">==</span> r)
    {
        tmp<span style="color:#f92672">-&gt;</span>sum <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>max_l <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>max_r <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>max_sum <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>val;
        tmp<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
    }
    <span style="color:#66d9ef">else</span>
    {
        <span style="color:#66d9ef">int</span> sum <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>val, size <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
        <span style="color:#66d9ef">if</span> (l <span style="color:#f92672">&lt;</span> mid)
        {
            attach_as_l_child(tmp, splay_build(l, mid));
            sum <span style="color:#f92672">+=</span> tmp<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>sum;
            size <span style="color:#f92672">+=</span> tmp<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size;
        }
        <span style="color:#66d9ef">if</span> (mid <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">&lt;</span> r)
        {
            attach_as_r_child(tmp, splay_build(mid <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, r));
            sum <span style="color:#f92672">+=</span> tmp<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>sum;
            size <span style="color:#f92672">+=</span> tmp<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>size;
        }
        tmp<span style="color:#f92672">-&gt;</span>sum <span style="color:#f92672">=</span> sum;
        tmp<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> size;
        splay_update_max(tmp);
    }
    <span style="color:#66d9ef">return</span> tmp;
}

<span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_remove</span>(splay_node <span style="color:#f92672">*</span>remove_node)
{
    <span style="color:#66d9ef">if</span> (remove_node<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL)
    {
        splay_remove(remove_node<span style="color:#f92672">-&gt;</span>l_child);
    }
    <span style="color:#66d9ef">if</span> (remove_node<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL)
    {
        splay_remove(remove_node<span style="color:#f92672">-&gt;</span>r_child);
    }
    delete_node(remove_node);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_insert</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> cur, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> length)
{
    splay_node <span style="color:#f92672">*</span>root <span style="color:#f92672">=</span> splay_build(<span style="color:#ae81ff">0</span>, length);
    <span style="color:#66d9ef">if</span> (head <span style="color:#f92672">==</span> NULL)
    {
        head <span style="color:#f92672">=</span> root;
    }
    <span style="color:#66d9ef">else</span>
    {
        <span style="color:#66d9ef">if</span> (cur <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>)
        {
            head <span style="color:#f92672">=</span> splay_route(splay_top());
            attach_as_l_child(head, root);
            splay_update_max(head);
            head<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>size;
            head<span style="color:#f92672">-&gt;</span>sum <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>sum;
        }
        <span style="color:#66d9ef">else</span>
        {
            head <span style="color:#f92672">=</span> splay_route(splay_find(cur));
            <span style="color:#66d9ef">if</span> (head<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL)
            {
                head<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> NULL;
                splay_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> splay_route(splay_top(head<span style="color:#f92672">-&gt;</span>r_child));
                attach_as_r_child(head, tmp);
                attach_as_l_child(tmp, root);
                splay_update_max(tmp);
                tmp<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>size;
                tmp<span style="color:#f92672">-&gt;</span>sum <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>sum;
                splay_update_max(head);
                head<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>size;
                head<span style="color:#f92672">-&gt;</span>sum <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>sum;
            }
            <span style="color:#66d9ef">else</span>
            {
                attach_as_r_child(head, root);
                head<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>size;
                head<span style="color:#f92672">-&gt;</span>sum <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>sum;
            }
        }
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_delete</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> cur, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> length)
{
    <span style="color:#66d9ef">if</span> (length <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>)
    {
        <span style="color:#66d9ef">return</span>;
    }
    <span style="color:#66d9ef">if</span> (cur <span style="color:#f92672">==</span> <span style="color:#ae81ff">1</span>)
    {
        <span style="color:#66d9ef">if</span> (head<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">&gt;</span> length)
        {
            head <span style="color:#f92672">=</span> splay_route(splay_find(length <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>));
            splay_remove(head<span style="color:#f92672">-&gt;</span>l_child);
            head<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> NULL;
            head<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> head<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
            head<span style="color:#f92672">-&gt;</span>sum <span style="color:#f92672">=</span> head<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>sum <span style="color:#f92672">+</span> head<span style="color:#f92672">-&gt;</span>val;
            splay_update_max(head);
        }
        <span style="color:#66d9ef">else</span>
        {
            splay_remove(head);
            head <span style="color:#f92672">=</span> NULL;
        }
    }
    <span style="color:#66d9ef">else</span>
    {
        head <span style="color:#f92672">=</span> splay_route(splay_find(cur <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>));
        <span style="color:#66d9ef">if</span> (head<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">&gt;</span> length)
        {
            head<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> NULL;
            splay_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> splay_route(splay_find(length <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, head<span style="color:#f92672">-&gt;</span>r_child));
            attach_as_r_child(head, tmp);
            tmp<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">-=</span> tmp<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size;
            tmp<span style="color:#f92672">-&gt;</span>sum <span style="color:#f92672">-=</span> tmp<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>sum;
            head<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">-=</span> tmp<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size;
            head<span style="color:#f92672">-&gt;</span>sum <span style="color:#f92672">-=</span> tmp<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>sum;
            splay_remove(tmp<span style="color:#f92672">-&gt;</span>l_child);
            tmp<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> NULL;
            splay_update_max(tmp);
            splay_update_max(head);
        }
        <span style="color:#66d9ef">else</span>
        {
            head<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">-=</span> head<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>size;
            head<span style="color:#f92672">-&gt;</span>sum <span style="color:#f92672">-=</span> head<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>sum;
            splay_remove(head<span style="color:#f92672">-&gt;</span>r_child);
            head<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> NULL;
            splay_update_max(head);
        }
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_make</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> cur, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> length, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> change_num)
{
    <span style="color:#66d9ef">if</span> (length <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>)
    {
        <span style="color:#66d9ef">return</span>;
    }
    <span style="color:#66d9ef">if</span> (cur <span style="color:#f92672">==</span> <span style="color:#ae81ff">1</span>)
    {
        <span style="color:#66d9ef">if</span> (head<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">&gt;</span> length)
        {
            head <span style="color:#f92672">=</span> splay_route(splay_find(length <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>));
            splay_change(head<span style="color:#f92672">-&gt;</span>l_child, change_num);
            head<span style="color:#f92672">-&gt;</span>sum <span style="color:#f92672">=</span> head<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>sum <span style="color:#f92672">+</span> head<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">+</span> (head<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> head<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>sum : <span style="color:#ae81ff">0</span>);
            splay_update_max(head);
        }
        <span style="color:#66d9ef">else</span>
        {
            splay_change(head, change_num);
        }
    }
    <span style="color:#66d9ef">else</span>
    {
        head <span style="color:#f92672">=</span> splay_route(splay_find(cur <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>));
        <span style="color:#66d9ef">if</span> (head<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">&gt;</span> length)
        {
            head<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> NULL;
            splay_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> splay_route(splay_find(length <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, head<span style="color:#f92672">-&gt;</span>r_child));
            attach_as_r_child(head, tmp);
            splay_change(tmp<span style="color:#f92672">-&gt;</span>l_child, change_num);
            tmp<span style="color:#f92672">-&gt;</span>sum <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>sum <span style="color:#f92672">+</span> tmp<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">+</span> (tmp<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> tmp<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>sum : <span style="color:#ae81ff">0</span>);
            splay_update_max(tmp);
            head<span style="color:#f92672">-&gt;</span>sum <span style="color:#f92672">=</span> (head<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> head<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>sum : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> head<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">+</span> tmp<span style="color:#f92672">-&gt;</span>sum;
            splay_update_max(head);
        }
        <span style="color:#66d9ef">else</span>
        {
            splay_change(head<span style="color:#f92672">-&gt;</span>r_child, change_num);
            head<span style="color:#f92672">-&gt;</span>sum <span style="color:#f92672">=</span> (head<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> head<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>sum : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> head<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">+</span> head<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>sum;
            splay_update_max(head);
        }
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_reverse</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> cur, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> length)
{
    <span style="color:#66d9ef">if</span> (length <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>)
    {
        <span style="color:#66d9ef">return</span>;
    }
    <span style="color:#66d9ef">if</span> (cur <span style="color:#f92672">==</span> <span style="color:#ae81ff">1</span>)
    {
        <span style="color:#66d9ef">if</span> (head<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">&gt;</span> length)
        {
            head <span style="color:#f92672">=</span> splay_route(splay_find(length <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>));
            splay_swap(head<span style="color:#f92672">-&gt;</span>l_child);
            splay_update_max(head);
        }
        <span style="color:#66d9ef">else</span>
        {
            splay_swap(head);
        }
    }
    <span style="color:#66d9ef">else</span>
    {
        head <span style="color:#f92672">=</span> splay_route(splay_find(cur <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>));
        <span style="color:#66d9ef">if</span> (head<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">&gt;</span> length)
        {
            head<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> NULL;
            splay_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> splay_route(splay_find(length <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, head<span style="color:#f92672">-&gt;</span>r_child));
            attach_as_r_child(head, tmp);
            splay_swap(tmp<span style="color:#f92672">-&gt;</span>l_child);
            splay_update_max(tmp);
            splay_update_max(head);
        }
        <span style="color:#66d9ef">else</span>
        {
            splay_swap(head<span style="color:#f92672">-&gt;</span>r_child);
            splay_update_max(head);
        }
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">splay_sum</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> cur, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> length)
{
    <span style="color:#66d9ef">if</span> (length <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>)
    {
        <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
    }
    <span style="color:#66d9ef">if</span> (cur <span style="color:#f92672">==</span> <span style="color:#ae81ff">1</span>)
    {
        <span style="color:#66d9ef">if</span> (head<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">&gt;</span> length)
        {
            head <span style="color:#f92672">=</span> splay_route(splay_find(length <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>));
            <span style="color:#66d9ef">return</span> head<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>sum;
        }
        <span style="color:#66d9ef">else</span>
        {
            <span style="color:#66d9ef">return</span> head<span style="color:#f92672">-&gt;</span>sum;
        }
    }
    <span style="color:#66d9ef">else</span>
    {
        head <span style="color:#f92672">=</span> splay_route(splay_find(cur <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>));
        <span style="color:#66d9ef">if</span> (head<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">&gt;</span> length)
        {
            head<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> NULL;
            splay_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> splay_route(splay_find(length <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, head<span style="color:#f92672">-&gt;</span>r_child));
            attach_as_r_child(head, tmp);
            <span style="color:#66d9ef">return</span> tmp<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>sum;
        }
        <span style="color:#66d9ef">else</span>
        {
            <span style="color:#66d9ef">return</span> head<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>sum;
        }
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">splay_max</span>()
{
    <span style="color:#66d9ef">return</span> head<span style="color:#f92672">-&gt;</span>max_sum;
}

<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span><span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_check</span>(splay_node <span style="color:#f92672">*</span>root <span style="color:#f92672">=</span> head, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">bool</span> down_change <span style="color:#f92672">=</span> false, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> change_num <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">bool</span> down_swap <span style="color:#f92672">=</span> false)
{
    <span style="color:#66d9ef">if</span> (root <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span>;
    }
    <span style="color:#66d9ef">int</span> size <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>, sum <span style="color:#f92672">=</span> down_change <span style="color:#f92672">?</span> change_num : root<span style="color:#f92672">-&gt;</span>val;
    <span style="color:#66d9ef">if</span> ((root<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL) <span style="color:#f92672">&amp;&amp;</span> (<span style="color:#f92672">!</span>down_swap))
    {
        <span style="color:#66d9ef">if</span> (root<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">!=</span> root)
        {
            printf(<span style="color:#e6db74">&#34;ERROR &#34;</span>);
        }
        splay_check(root<span style="color:#f92672">-&gt;</span>l_child, root<span style="color:#f92672">-&gt;</span>down_change <span style="color:#f92672">||</span> down_change, down_change <span style="color:#f92672">?</span> change_num : root<span style="color:#f92672">-&gt;</span>change_num, down_swap <span style="color:#f92672">^</span> root<span style="color:#f92672">-&gt;</span>down_swap);
        size <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size;
        <span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span>root<span style="color:#f92672">-&gt;</span>down_change)
        {
            sum <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>sum;
        }
        <span style="color:#66d9ef">else</span>
        {
            sum <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">*</span> root<span style="color:#f92672">-&gt;</span>change_num;
        }
    }
    <span style="color:#66d9ef">if</span> ((root<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL) <span style="color:#f92672">&amp;&amp;</span> down_swap)
    {
        <span style="color:#66d9ef">if</span> (root<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">!=</span> root)
        {
            printf(<span style="color:#e6db74">&#34;ERROR &#34;</span>);
        }
        splay_check(root<span style="color:#f92672">-&gt;</span>r_child, root<span style="color:#f92672">-&gt;</span>down_change <span style="color:#f92672">||</span> down_change, down_change <span style="color:#f92672">?</span> change_num : root<span style="color:#f92672">-&gt;</span>change_num, down_swap <span style="color:#f92672">^</span> root<span style="color:#f92672">-&gt;</span>down_swap);
        size <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>size;
        <span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span>root<span style="color:#f92672">-&gt;</span>down_change)
        {
            sum <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>sum;
        }
        <span style="color:#66d9ef">else</span>
        {
            sum <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">*</span> root<span style="color:#f92672">-&gt;</span>change_num;
        }
    }
    printf(<span style="color:#e6db74">&#34;%d &#34;</span>, down_change <span style="color:#f92672">?</span> change_num : root<span style="color:#f92672">-&gt;</span>val);
    <span style="color:#66d9ef">if</span> ((root<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL) <span style="color:#f92672">&amp;&amp;</span> (<span style="color:#f92672">!</span>down_swap))
    {
        <span style="color:#66d9ef">if</span> (root<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">!=</span> root)
        {
            printf(<span style="color:#e6db74">&#34;ERROR &#34;</span>);
        }
        splay_check(root<span style="color:#f92672">-&gt;</span>r_child, root<span style="color:#f92672">-&gt;</span>down_change <span style="color:#f92672">||</span> down_change, down_change <span style="color:#f92672">?</span> change_num : root<span style="color:#f92672">-&gt;</span>change_num, down_swap <span style="color:#f92672">^</span> root<span style="color:#f92672">-&gt;</span>down_swap);
        size <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>size;
        <span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span>root<span style="color:#f92672">-&gt;</span>down_change)
        {
            sum <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>sum;
        }
        <span style="color:#66d9ef">else</span>
        {
            sum <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">*</span> root<span style="color:#f92672">-&gt;</span>change_num;
        }
    }
    <span style="color:#66d9ef">if</span> ((root<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL) <span style="color:#f92672">&amp;&amp;</span> down_swap)
    {
        <span style="color:#66d9ef">if</span> (root<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">!=</span> root)
        {
            printf(<span style="color:#e6db74">&#34;ERROR &#34;</span>);
            exit(<span style="color:#ae81ff">0</span>);
        }
        splay_check(root<span style="color:#f92672">-&gt;</span>l_child, root<span style="color:#f92672">-&gt;</span>down_change <span style="color:#f92672">||</span> down_change, down_change <span style="color:#f92672">?</span> change_num : root<span style="color:#f92672">-&gt;</span>change_num, down_swap <span style="color:#f92672">^</span> root<span style="color:#f92672">-&gt;</span>down_swap);
        size <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size;
        <span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span>root<span style="color:#f92672">-&gt;</span>down_change)
        {
            sum <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>sum;
        }
        <span style="color:#66d9ef">else</span>
        {
            sum <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">*</span> root<span style="color:#f92672">-&gt;</span>change_num;
        }
    }
    <span style="color:#66d9ef">if</span> ((<span style="color:#f92672">!</span>down_change) <span style="color:#f92672">&amp;&amp;</span> (sum <span style="color:#f92672">!=</span> root<span style="color:#f92672">-&gt;</span>sum))
    {
        printf(<span style="color:#e6db74">&#34;ERROR_SUM &#34;</span>);
        exit(<span style="color:#ae81ff">0</span>);
    }
    <span style="color:#66d9ef">if</span> (size <span style="color:#f92672">!=</span> root<span style="color:#f92672">-&gt;</span>size)
    {
        printf(<span style="color:#e6db74">&#34;ERROR_SIZE &#34;</span>);
        exit(<span style="color:#ae81ff">0</span>);
    }
}
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span><span style="color:#75715e">/*---splay---*/</span>

<span style="color:#66d9ef">char</span> operator_string[<span style="color:#ae81ff">10</span>];
<span style="color:#66d9ef">int</span> cur, length, change_num;

<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span><span style="color:#66d9ef">int</span> sum <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    ll start_time_ <span style="color:#f92672">=</span> clock();
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;sequence.in&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>, stdin);
<span style="color:#75715e">#ifndef DEBUG_STD
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;sequence.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>    fread(fread_string, <span style="color:#ae81ff">1</span>, MAXS, stdin);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    init_memory();
    read(<span style="color:#f92672">&amp;</span>n);
    read(<span style="color:#f92672">&amp;</span>m);
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> n; i<span style="color:#f92672">++</span>)
    {
        read(insert_num <span style="color:#f92672">+</span> i);
    }
    splay_insert(<span style="color:#ae81ff">0</span>, n);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>    splay_check();
    sum <span style="color:#f92672">=</span> n;
    printf(<span style="color:#e6db74">&#34;n&#34;</span>);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> m; i<span style="color:#f92672">++</span>)
    {
        read(operator_string);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>        <span style="color:#66d9ef">if</span> (i <span style="color:#f92672">==</span> <span style="color:#ae81ff">31</span>)
        {
            printf(<span style="color:#e6db74">&#34;DEBUGn&#34;</span>);
        }
        printf(<span style="color:#e6db74">&#34;%d SUM:%d %s &#34;</span>, i, sum, operator_string);
        <span style="color:#66d9ef">if</span> (sum <span style="color:#f92672">!=</span> head<span style="color:#f92672">-&gt;</span>size)
        {
            printf(<span style="color:#e6db74">&#34;nERROR_SUMn&#34;</span>);
            exit(<span style="color:#ae81ff">0</span>);
        }
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>        <span style="color:#66d9ef">if</span> (operator_string[<span style="color:#ae81ff">2</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;S&#39;</span>)
        {
            read(<span style="color:#f92672">&amp;</span>cur);
            read(<span style="color:#f92672">&amp;</span>length);
            <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> j <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; j <span style="color:#f92672">&lt;</span> length; j<span style="color:#f92672">++</span>)
            {
                read(insert_num <span style="color:#f92672">+</span> j);
            }
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;%d %dn&#34;</span>, cur, length);
            sum <span style="color:#f92672">+=</span> length;
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>            splay_insert(cur, length);
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operator_string[<span style="color:#ae81ff">2</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;L&#39;</span>)
        {
            read(<span style="color:#f92672">&amp;</span>cur);
            read(<span style="color:#f92672">&amp;</span>length);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;%d %dn&#34;</span>, cur, length);
            sum <span style="color:#f92672">-=</span> length;
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>            splay_delete(cur, length);
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operator_string[<span style="color:#ae81ff">2</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;K&#39;</span>)
        {
            read(<span style="color:#f92672">&amp;</span>cur);
            read(<span style="color:#f92672">&amp;</span>length);
            read(<span style="color:#f92672">&amp;</span>change_num);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;%d %d %dn&#34;</span>, cur, length, change_num);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>            splay_make(cur, length, change_num);
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operator_string[<span style="color:#ae81ff">2</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;V&#39;</span>)
        {
            read(<span style="color:#f92672">&amp;</span>cur);
            read(<span style="color:#f92672">&amp;</span>length);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;%d %dn&#34;</span>, cur, length);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>            splay_reverse(cur, length);
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operator_string[<span style="color:#ae81ff">2</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;T&#39;</span>)
        {
            read(<span style="color:#f92672">&amp;</span>cur);
            read(<span style="color:#f92672">&amp;</span>length);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;%d %dn&#34;</span>, cur, length);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, splay_sum(cur, length));
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operator_string[<span style="color:#ae81ff">2</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;X&#39;</span>)
        {
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;n&#34;</span>);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, splay_max());
        }
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>        splay_check();
        printf(<span style="color:#e6db74">&#34;n&#34;</span>);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    }
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    printf(<span style="color:#e6db74">&#34;run time: %lld msn&#34;</span>, clock() <span style="color:#f92672">-</span> start_time_);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    fclose(stdin);
<span style="color:#75715e">#ifndef DEBUG_STD
</span><span style="color:#75715e"></span>    fclose(stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
}

<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">int</span> n, m;
<span style="color:#66d9ef">int</span> num_line[<span style="color:#ae81ff">1000</span>], tmp[<span style="color:#ae81ff">1000</span>];
<span style="color:#66d9ef">int</span> length, cur, len, k;
<span style="color:#66d9ef">char</span> operator_string[<span style="color:#ae81ff">10</span>];

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">printline</span>()
{
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;=</span> length; i<span style="color:#f92672">++</span>)
    {
        printf(<span style="color:#e6db74">&#34;%d &#34;</span>, num_line[i]);
    }
    printf(<span style="color:#e6db74">&#34;n&#34;</span>);
}

<span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
    freopen(<span style="color:#e6db74">&#34;sequence2.in&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>, stdin);
    freopen(<span style="color:#e6db74">&#34;std.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
    scanf(<span style="color:#e6db74">&#34;%d %d&#34;</span>, <span style="color:#f92672">&amp;</span>n, <span style="color:#f92672">&amp;</span>m);
    length <span style="color:#f92672">=</span> n;
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; i <span style="color:#f92672">&lt;=</span> length; i<span style="color:#f92672">++</span>)
    {
        scanf(<span style="color:#e6db74">&#34;%d&#34;</span>, num_line <span style="color:#f92672">+</span> i);
    }
    printline();
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> m; i<span style="color:#f92672">++</span>)
    {
        scanf(<span style="color:#e6db74">&#34;%s&#34;</span>, operator_string);
        printf(<span style="color:#e6db74">&#34;%d SUM:%d %s &#34;</span>, i, length, operator_string);
        <span style="color:#66d9ef">if</span> (operator_string[<span style="color:#ae81ff">2</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;S&#39;</span>)
        {
            scanf(<span style="color:#e6db74">&#34;%d %d&#34;</span>, <span style="color:#f92672">&amp;</span>cur, <span style="color:#f92672">&amp;</span>len);
            printf(<span style="color:#e6db74">&#34;%d %dn&#34;</span>, cur, len);
            length <span style="color:#f92672">+=</span> len;
            <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> j <span style="color:#f92672">=</span> length; j <span style="color:#f92672">&gt;</span> cur <span style="color:#f92672">+</span> len; j<span style="color:#f92672">--</span>)
            {
                num_line[j] <span style="color:#f92672">=</span> num_line[j <span style="color:#f92672">-</span> len];
            }
            <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> j <span style="color:#f92672">=</span> cur <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>; j <span style="color:#f92672">&lt;=</span> cur <span style="color:#f92672">+</span> len; j<span style="color:#f92672">++</span>)
            {
                scanf(<span style="color:#e6db74">&#34;%d&#34;</span>, num_line <span style="color:#f92672">+</span> j);
            }
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operator_string[<span style="color:#ae81ff">2</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;L&#39;</span>)
        {
            scanf(<span style="color:#e6db74">&#34;%d %d&#34;</span>, <span style="color:#f92672">&amp;</span>cur, <span style="color:#f92672">&amp;</span>len);
            printf(<span style="color:#e6db74">&#34;%d %dn&#34;</span>, cur, len);
            length <span style="color:#f92672">-=</span> len;
            <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> j <span style="color:#f92672">=</span> cur; j <span style="color:#f92672">&lt;=</span> length; j<span style="color:#f92672">++</span>)
            {
                num_line[j] <span style="color:#f92672">=</span> num_line[j <span style="color:#f92672">+</span> len];
            }
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operator_string[<span style="color:#ae81ff">2</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;K&#39;</span>)
        {
            scanf(<span style="color:#e6db74">&#34;%d %d %d&#34;</span>, <span style="color:#f92672">&amp;</span>cur, <span style="color:#f92672">&amp;</span>len, <span style="color:#f92672">&amp;</span>k);
            printf(<span style="color:#e6db74">&#34;%d %d %dn&#34;</span>, cur, len, k);
            <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> j <span style="color:#f92672">=</span> cur; j <span style="color:#f92672">&lt;</span> cur <span style="color:#f92672">+</span> len; j<span style="color:#f92672">++</span>)
            {
                num_line[j] <span style="color:#f92672">=</span> k;
            }
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operator_string[<span style="color:#ae81ff">2</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;V&#39;</span>)
        {
            scanf(<span style="color:#e6db74">&#34;%d %d&#34;</span>, <span style="color:#f92672">&amp;</span>cur, <span style="color:#f92672">&amp;</span>len);
            printf(<span style="color:#e6db74">&#34;%d %dn&#34;</span>, cur, len);
            <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> j <span style="color:#f92672">=</span> cur, k <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; j <span style="color:#f92672">&lt;</span> cur <span style="color:#f92672">+</span> len; j<span style="color:#f92672">++</span>, k<span style="color:#f92672">++</span>)
            {
                tmp[k] <span style="color:#f92672">=</span> num_line[j];
            }
            <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> j <span style="color:#f92672">=</span> cur, k <span style="color:#f92672">=</span> len; j <span style="color:#f92672">&lt;</span> cur <span style="color:#f92672">+</span> len; j<span style="color:#f92672">++</span>, k<span style="color:#f92672">--</span>)
            {
                num_line[j] <span style="color:#f92672">=</span> tmp[k];
            }
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operator_string[<span style="color:#ae81ff">2</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;T&#39;</span>)
        {
            scanf(<span style="color:#e6db74">&#34;%d %d&#34;</span>, <span style="color:#f92672">&amp;</span>cur, <span style="color:#f92672">&amp;</span>len);
            printf(<span style="color:#e6db74">&#34;%d %dn&#34;</span>, cur, len);
            <span style="color:#66d9ef">int</span> sum <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
            <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> j <span style="color:#f92672">=</span> cur; j <span style="color:#f92672">&lt;</span> cur <span style="color:#f92672">+</span> len; j<span style="color:#f92672">++</span>)
            {
                sum <span style="color:#f92672">+=</span> num_line[j];
            }
            printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, sum);
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operator_string[<span style="color:#ae81ff">2</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;X&#39;</span>)
        {
            printf(<span style="color:#e6db74">&#34;n&#34;</span>);
            printf(<span style="color:#e6db74">&#34;0n&#34;</span>);
        }
        printline();
    }
}

<span style="color:#75715e">#endif
</span></code></pre></div>]]></content></item><item><title>[BZOJ1269][AHOI2006]文本编辑器（SPLAY）</title><link>https://www.sxn.dev/posts/ahoi2006-editor/</link><pubDate>Fri, 02 May 2014 19:20:38 +0000</pubDate><guid>https://www.sxn.dev/posts/ahoi2006-editor/</guid><description>&lt;p>好吧这道题是NOI的那道EDITOR的升级版，就多了一个翻转操作，那不是改一下就行了嘛，果断继续A题&lt;/p></description><content type="html"><![CDATA[<p>好吧这道题是NOI的那道EDITOR的升级版，就多了一个翻转操作，那不是改一下就行了嘛，果断继续A题</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#75715e">//AHOI2006 DAY1 editor.cpp splay
</span><span style="color:#75715e"></span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;algorithm&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;iostream&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstring&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdio&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;string&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cmath&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;queue&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;stack&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span>
<span style="color:#75715e">//#define LOCAL
</span><span style="color:#75715e"></span><span style="color:#75715e">#define READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define READ_FILE
</span><span style="color:#75715e">//#define VISUAL_STUDIO
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef VISUAL_STUDIO
</span><span style="color:#75715e">#pragma warning(disable:4996)
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL
</span><span style="color:#75715e">#define LOCAL_TIME
</span><span style="color:#75715e">#define LOCAL_DEBUG
</span><span style="color:#75715e">#define STD_DEBUG
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;ctime&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXS <span style="color:#f92672">=</span> <span style="color:#ae81ff">6</span> <span style="color:#f92672">*</span> <span style="color:#ae81ff">1024</span> <span style="color:#f92672">*</span> <span style="color:#ae81ff">1024</span>;
<span style="color:#66d9ef">char</span> fread_string[MAXS];
<span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>fread_point <span style="color:#f92672">=</span> fread_string;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">get_int</span>()
{
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">while</span> ((<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">&lt;</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">||</span> (<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">&gt;</span> <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        fread_point<span style="color:#f92672">++</span>;
    }
    <span style="color:#66d9ef">while</span> ((<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">&gt;=</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">&lt;=</span> <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        ret <span style="color:#f92672">=</span> ret <span style="color:#f92672">*</span> <span style="color:#ae81ff">10</span> <span style="color:#f92672">+</span> <span style="color:#f92672">*</span>(fread_point<span style="color:#f92672">++</span>) <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;0&#39;</span>;
    }
    <span style="color:#66d9ef">return</span> ret;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">get_string</span>(<span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>input_string)
{
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>    memset(input_string, <span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">7</span>);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">while</span> ((<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39; &#39;</span>) <span style="color:#f92672">||</span> (<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;n&#39;</span>))
    {
        fread_point<span style="color:#f92672">++</span>;
    }
    <span style="color:#66d9ef">int</span> leng <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">while</span> ((<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">!=</span> <span style="color:#e6db74">&#39; &#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">!=</span> <span style="color:#e6db74">&#39;n&#39;</span>))
    {
        input_string[leng<span style="color:#f92672">++</span>] <span style="color:#f92672">=</span> <span style="color:#f92672">*</span>(fread_point<span style="color:#f92672">++</span>);
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">get_insert</span>(<span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>input_string, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> length)
{
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> length; i<span style="color:#f92672">++</span>)
    {
        <span style="color:#66d9ef">while</span> (<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;n&#39;</span>)
        {
            fread_point<span style="color:#f92672">++</span>;
        }
        input_string[i] <span style="color:#f92672">=</span> <span style="color:#f92672">*</span>(fread_point<span style="color:#f92672">++</span>);
    }
}

<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">typedef</span> <span style="color:#66d9ef">long</span> <span style="color:#66d9ef">long</span> ll;

<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXN <span style="color:#f92672">=</span> <span style="color:#ae81ff">2</span> <span style="color:#f92672">*</span> <span style="color:#ae81ff">1024</span> <span style="color:#f92672">*</span> <span style="color:#ae81ff">1024</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">10</span>;

<span style="color:#75715e">/*---recover memory---*/</span>
<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">splay_node</span>
{
    <span style="color:#66d9ef">char</span> val;
    splay_node <span style="color:#f92672">*</span>parent, <span style="color:#f92672">*</span>l_child, <span style="color:#f92672">*</span>r_child;
    <span style="color:#66d9ef">int</span> size;
    <span style="color:#66d9ef">bool</span> down_swap;
    <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">init</span>()
    {
        parent <span style="color:#f92672">=</span> l_child <span style="color:#f92672">=</span> r_child <span style="color:#f92672">=</span> NULL;
        down_swap <span style="color:#f92672">=</span> false;
    }
    splay_node()
    {
        init();
    }
    <span style="color:#f92672">~</span>splay_node()
    {
    }
};

splay_node splay_memory[MAXN];
splay_node <span style="color:#f92672">*</span>memory_stack[MAXN];
<span style="color:#66d9ef">int</span> stack_top;

<span style="color:#66d9ef">void</span> <span style="color:#a6e22e">init_memory</span>()
{
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> MAXN; i<span style="color:#f92672">++</span>)
    {
        memory_stack[i] <span style="color:#f92672">=</span> splay_memory <span style="color:#f92672">+</span> i;
    }
    stack_top <span style="color:#f92672">=</span> MAXN;
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">new_node</span>()
{
    <span style="color:#66d9ef">return</span> memory_stack[<span style="color:#f92672">--</span>stack_top];
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">delete_node</span>(splay_node <span style="color:#f92672">*</span>del_node)
{
    memory_stack[stack_top<span style="color:#f92672">++</span>] <span style="color:#f92672">=</span> del_node;
    del_node<span style="color:#f92672">-&gt;</span>init();
}
<span style="color:#75715e">/*---recover memory---*/</span>

<span style="color:#66d9ef">char</span> insert_string[MAXN];

splay_node <span style="color:#f92672">*</span>head <span style="color:#f92672">=</span> NULL, <span style="color:#f92672">*</span>cur <span style="color:#f92672">=</span> NULL;

<span style="color:#75715e">/*--splay---*/</span>
<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">attach_as_l_child</span>(splay_node <span style="color:#f92672">*</span>parent, splay_node <span style="color:#f92672">*</span>child)
{
    parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> child;
    <span style="color:#66d9ef">if</span> (child <span style="color:#f92672">!=</span> NULL)
    {
        child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">attach_as_r_child</span>(splay_node <span style="color:#f92672">*</span>parent, splay_node <span style="color:#f92672">*</span>child)
{
    parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> child;
    <span style="color:#66d9ef">if</span> (child <span style="color:#f92672">!=</span> NULL)
    {
        child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_swap</span>(splay_node <span style="color:#f92672">*</span>swap_node)
{
    <span style="color:#66d9ef">if</span> (swap_node <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span>;
    }
    splay_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> swap_node<span style="color:#f92672">-&gt;</span>l_child;
    swap_node<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> swap_node<span style="color:#f92672">-&gt;</span>r_child;
    swap_node<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> tmp;
    swap_node<span style="color:#f92672">-&gt;</span>down_swap <span style="color:#f92672">=</span> <span style="color:#f92672">!</span>swap_node<span style="color:#f92672">-&gt;</span>down_swap;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_down</span>(splay_node <span style="color:#f92672">*</span>root)
{
    <span style="color:#66d9ef">if</span> (root<span style="color:#f92672">-&gt;</span>down_swap)
    {
        splay_swap(root<span style="color:#f92672">-&gt;</span>l_child);
        splay_swap(root<span style="color:#f92672">-&gt;</span>r_child);
        root<span style="color:#f92672">-&gt;</span>down_swap <span style="color:#f92672">=</span> <span style="color:#f92672">!</span>root<span style="color:#f92672">-&gt;</span>down_swap;
    }
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">build_splay</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> l, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> r, <span style="color:#66d9ef">int</span> <span style="color:#f92672">*</span>ret_size)
{
    <span style="color:#66d9ef">int</span> mid <span style="color:#f92672">=</span> (l <span style="color:#f92672">+</span> r) <span style="color:#f92672">&gt;&gt;</span> <span style="color:#ae81ff">1</span>;
    splay_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> new_node();
    tmp<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">=</span> insert_string[mid];
    <span style="color:#f92672">*</span>ret_size <span style="color:#f92672">+=</span> <span style="color:#ae81ff">1</span>;
    <span style="color:#66d9ef">if</span> (l <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">==</span> r)
    {
        tmp<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
    }
    <span style="color:#66d9ef">else</span>
    {
        <span style="color:#66d9ef">int</span> size <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
        <span style="color:#66d9ef">if</span> (l <span style="color:#f92672">&lt;</span> mid)
        {
            attach_as_l_child(tmp, build_splay(l, mid, <span style="color:#f92672">&amp;</span>size));
        }
        <span style="color:#66d9ef">if</span> (mid <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">&lt;</span> r)
        {
            attach_as_r_child(tmp, tmp<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> build_splay(mid <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, r, <span style="color:#f92672">&amp;</span>size));
        }
        tmp<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> size <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
        <span style="color:#f92672">*</span>ret_size <span style="color:#f92672">+=</span> size;
    }
    <span style="color:#66d9ef">return</span> tmp;
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_top</span>(splay_node <span style="color:#f92672">*</span>root <span style="color:#f92672">=</span> head)
{
    <span style="color:#66d9ef">for</span> (splay_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> root; tmp <span style="color:#f92672">!=</span> NULL; tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>l_child)
    {
        splay_down(tmp);
        <span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> NULL)
        {
            <span style="color:#66d9ef">return</span> tmp;
        }
    }
    <span style="color:#66d9ef">return</span> NULL;
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_bottom</span>(splay_node <span style="color:#f92672">*</span>root <span style="color:#f92672">=</span> head)
{
    <span style="color:#66d9ef">for</span> (splay_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> root; tmp <span style="color:#f92672">!=</span> NULL; tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>r_child)
    {
        splay_down(tmp);
        <span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">==</span> NULL)
        {
            <span style="color:#66d9ef">return</span> tmp;
        }
    }
    <span style="color:#66d9ef">return</span> NULL;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zig</span>(splay_node <span style="color:#f92672">*</span>axis)
{
    splay_node <span style="color:#f92672">*</span>left_child <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>l_child;
    splay_node <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>parent;
    left_child<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>size;
    axis<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> (left_child<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> left_child<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> (axis<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> axis<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
    attach_as_l_child(axis, left_child<span style="color:#f92672">-&gt;</span>r_child);
    attach_as_r_child(left_child, axis);
    left_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    <span style="color:#66d9ef">if</span> (parent <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> axis)
        {
            attach_as_l_child(parent, left_child);
        }
        <span style="color:#66d9ef">else</span>
        {
            attach_as_r_child(parent, left_child);
        }
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zag</span>(splay_node <span style="color:#f92672">*</span>axis)
{
    splay_node <span style="color:#f92672">*</span>right_child <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>r_child;
    splay_node <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>parent;
    right_child<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>size;
    axis<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> (right_child<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> right_child<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> (axis<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> axis<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
    attach_as_r_child(axis, right_child<span style="color:#f92672">-&gt;</span>l_child);
    attach_as_l_child(right_child, axis);
    right_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    <span style="color:#66d9ef">if</span> (parent <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> axis)
        {
            attach_as_l_child(parent, right_child);
        }
        <span style="color:#66d9ef">else</span>
        {
            attach_as_r_child(parent, right_child);
        }
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zig_zig</span>(splay_node <span style="color:#f92672">*</span>axis)
{
    zig(axis<span style="color:#f92672">-&gt;</span>l_child);
    zig(axis);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zag_zag</span>(splay_node <span style="color:#f92672">*</span>axis)
{
    zag(axis<span style="color:#f92672">-&gt;</span>r_child);
    zag(axis);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zig_zag</span>(splay_node <span style="color:#f92672">*</span>axis)
{
    zig(axis<span style="color:#f92672">-&gt;</span>r_child);
    zag(axis);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zag_zig</span>(splay_node <span style="color:#f92672">*</span>axis)
{
    zag(axis<span style="color:#f92672">-&gt;</span>l_child);
    zig(axis);
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_route</span>(splay_node <span style="color:#f92672">*</span>v)
{
    splay_node <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> NULL, <span style="color:#f92672">*</span>grandparent <span style="color:#f92672">=</span> NULL;
    <span style="color:#66d9ef">while</span> (((parent <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>parent) <span style="color:#f92672">!=</span> NULL) <span style="color:#f92672">&amp;&amp;</span> ((grandparent <span style="color:#f92672">=</span> parent<span style="color:#f92672">-&gt;</span>parent) <span style="color:#f92672">!=</span> NULL))
    {
        splay_down(grandparent);
        splay_down(parent);
        splay_down(v);
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> v)
        {
            <span style="color:#66d9ef">if</span> (grandparent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> parent)
            {
                zig_zig(grandparent);
            }
            <span style="color:#66d9ef">else</span>
            {
                zig_zag(grandparent);
            }
        }
        <span style="color:#66d9ef">else</span>
        {
            <span style="color:#66d9ef">if</span> (grandparent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">==</span> parent)
            {
                zag_zag(grandparent);
            }
            <span style="color:#66d9ef">else</span>
            {
                zag_zig(grandparent);
            }
        }
    }
    <span style="color:#66d9ef">if</span> ((parent <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>parent) <span style="color:#f92672">!=</span> NULL)
    {
        splay_down(parent);
        splay_down(v);
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> v)
        {
            zig(parent);
        }
        <span style="color:#66d9ef">else</span>
        {
            zag(parent);
        }
    }
    <span style="color:#66d9ef">return</span> v;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_insert</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> length)
{
    get_insert(insert_string, length);
    <span style="color:#66d9ef">int</span> size <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    splay_node <span style="color:#f92672">*</span>root <span style="color:#f92672">=</span> build_splay(<span style="color:#ae81ff">0</span>, length, <span style="color:#f92672">&amp;</span>size);
    <span style="color:#66d9ef">if</span> (head <span style="color:#f92672">==</span> NULL)
    {
        head <span style="color:#f92672">=</span> root;
    }
    <span style="color:#66d9ef">else</span>
    {
        <span style="color:#66d9ef">if</span> (cur <span style="color:#f92672">==</span> NULL)
        {
            head <span style="color:#f92672">=</span> splay_route(splay_top());
            attach_as_l_child(head, root);
            head<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>size;
        }
        <span style="color:#66d9ef">else</span>
        {
            head <span style="color:#f92672">=</span> splay_route(cur);
            <span style="color:#66d9ef">if</span> (head<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL)
            {
                head<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> NULL;
                splay_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> splay_route(splay_top(head<span style="color:#f92672">-&gt;</span>r_child));
                attach_as_r_child(head, tmp);
                attach_as_l_child(tmp, root);
                tmp<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>size;
                head<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>size;
            }
            <span style="color:#66d9ef">else</span>
            {
                attach_as_r_child(head, root);
                head<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>size;
            }
        }
    }
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_move</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> move_id, splay_node <span style="color:#f92672">*</span>root <span style="color:#f92672">=</span> head)
{
    <span style="color:#66d9ef">if</span> (move_id <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>)
    {
        <span style="color:#66d9ef">return</span> NULL;
    }
    <span style="color:#66d9ef">int</span> total_size <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">for</span> (splay_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> root; tmp <span style="color:#f92672">!=</span> NULL;)
    {
        splay_down(tmp);
        <span style="color:#66d9ef">if</span> (total_size <span style="color:#f92672">+</span> (tmp<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> tmp<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">==</span> move_id)
        {
            <span style="color:#66d9ef">return</span> tmp;
            <span style="color:#66d9ef">break</span>;
        }
        <span style="color:#66d9ef">if</span> (total_size <span style="color:#f92672">+</span> (tmp<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> tmp<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">&lt;</span> move_id)
        {
            total_size <span style="color:#f92672">+=</span> (tmp<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> tmp<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>r_child;
        }
        <span style="color:#66d9ef">else</span>
        {
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>l_child;
        }
    }
    <span style="color:#66d9ef">return</span> NULL;
}

<span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_remove</span>(splay_node <span style="color:#f92672">*</span> remove_root)
{
    <span style="color:#66d9ef">if</span> (remove_root <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span>;
    }
    <span style="color:#66d9ef">if</span> (remove_root<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL)
    {
        splay_remove(remove_root<span style="color:#f92672">-&gt;</span>l_child);
    }
    <span style="color:#66d9ef">if</span> (remove_root<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL)
    {
        splay_remove(remove_root<span style="color:#f92672">-&gt;</span>r_child);
    }
    delete_node(remove_root);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_delete</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> length)
{
    <span style="color:#66d9ef">if</span> (cur <span style="color:#f92672">!=</span> NULL)
    {
        head <span style="color:#f92672">=</span> splay_route(cur);
        <span style="color:#66d9ef">if</span> (head<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">&gt;</span> length)
        {
            head<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> NULL;
            splay_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> splay_route(splay_move(length <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, head<span style="color:#f92672">-&gt;</span>r_child));
            attach_as_r_child(head, tmp);
            tmp<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">-=</span> tmp<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size;
            head<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">-=</span> tmp<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size;
            tmp<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> NULL;
            splay_remove(tmp<span style="color:#f92672">-&gt;</span>l_child);
        }
        <span style="color:#66d9ef">else</span>
        {
            head<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">-=</span> length;
            splay_remove(head<span style="color:#f92672">-&gt;</span>r_child);
            head<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> NULL;
        }
    }
    <span style="color:#66d9ef">else</span>
    {
        <span style="color:#66d9ef">if</span> (head<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">&gt;</span> length)
        {
            head <span style="color:#f92672">=</span> splay_route(splay_move(length <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>));
            head<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">-=</span> length;
            splay_remove(head<span style="color:#f92672">-&gt;</span>l_child);
            head<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> NULL;
        }
        <span style="color:#66d9ef">else</span>
        {
            splay_remove(head);
            head <span style="color:#f92672">=</span> NULL;
        }
    }
}

<span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_print</span>(splay_node <span style="color:#f92672">*</span>root)
{
    <span style="color:#66d9ef">if</span> (root <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span>;
    }
    <span style="color:#66d9ef">if</span> (root<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL)
    {
        splay_print(root<span style="color:#f92672">-&gt;</span>l_child);
    }
    printf(<span style="color:#e6db74">&#34;%c&#34;</span>, root<span style="color:#f92672">-&gt;</span>val);
    <span style="color:#66d9ef">if</span> (root<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL)
    {
        splay_print(root<span style="color:#f92672">-&gt;</span>r_child);
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_get</span>()
{
    <span style="color:#66d9ef">if</span> (cur <span style="color:#f92672">!=</span> NULL)
    {
        head <span style="color:#f92672">=</span> splay_route(cur);
        printf(<span style="color:#e6db74">&#34;%cn&#34;</span>, splay_top(head<span style="color:#f92672">-&gt;</span>r_child)<span style="color:#f92672">-&gt;</span>val);
    }
    <span style="color:#66d9ef">else</span>
    {
        head <span style="color:#f92672">=</span> splay_route(splay_top());
        printf(<span style="color:#e6db74">&#34;%cn&#34;</span>, head<span style="color:#f92672">-&gt;</span>val);
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_prev</span>()
{
    head <span style="color:#f92672">=</span> splay_route(cur);
    cur <span style="color:#f92672">=</span> splay_bottom(head<span style="color:#f92672">-&gt;</span>l_child);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_next</span>()
{
    <span style="color:#66d9ef">if</span> (cur <span style="color:#f92672">==</span> NULL)
    {
        cur <span style="color:#f92672">=</span> head <span style="color:#f92672">=</span> splay_route(splay_top());
    }
    <span style="color:#66d9ef">else</span>
    {
        head <span style="color:#f92672">=</span> splay_route(cur);
        cur <span style="color:#f92672">=</span> splay_top(head<span style="color:#f92672">-&gt;</span>r_child);
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_rotate</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> length)
{
    <span style="color:#66d9ef">if</span> (cur <span style="color:#f92672">!=</span> NULL)
    {
        head <span style="color:#f92672">=</span> splay_route(cur);
        <span style="color:#66d9ef">if</span> (head<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">&gt;</span> length)
        {
            head<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> NULL;
            splay_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> splay_route(splay_move(length <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, head<span style="color:#f92672">-&gt;</span>r_child));
            attach_as_r_child(head, tmp);
            splay_swap(tmp<span style="color:#f92672">-&gt;</span>l_child);
        }
        <span style="color:#66d9ef">else</span>
        {
            splay_swap(head<span style="color:#f92672">-&gt;</span>r_child);
        }
    }
    <span style="color:#66d9ef">else</span>
    {
        <span style="color:#66d9ef">if</span> (head<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">&gt;</span> length)
        {
            head <span style="color:#f92672">=</span> splay_route(splay_move(length <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>));
            splay_swap(head<span style="color:#f92672">-&gt;</span>l_child);
        }
        <span style="color:#66d9ef">else</span>
        {
            splay_swap(head);
        }
    }
}

<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span><span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_check</span>(splay_node <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> NULL)
{
    <span style="color:#66d9ef">if</span> (parent <span style="color:#f92672">==</span> NULL)
    {
        parent <span style="color:#f92672">=</span> head;
    }
    <span style="color:#66d9ef">if</span> (parent <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span>;
    }
    <span style="color:#66d9ef">int</span> size <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
    <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">!=</span> parent)
        {
            printf(<span style="color:#e6db74">&#34;ERROR &#34;</span>);
        }
        size <span style="color:#f92672">+=</span> parent<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size;
        splay_check(parent<span style="color:#f92672">-&gt;</span>l_child);
    }
    printf(<span style="color:#e6db74">&#34;%c&#34;</span>, parent<span style="color:#f92672">-&gt;</span>val);
    <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">!=</span> parent)
        {
            printf(<span style="color:#e6db74">&#34;ERROR &#34;</span>);
        }
        size <span style="color:#f92672">+=</span> parent<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>size;
        splay_check(parent<span style="color:#f92672">-&gt;</span>r_child);
    }
    <span style="color:#66d9ef">if</span> (size <span style="color:#f92672">!=</span> parent<span style="color:#f92672">-&gt;</span>size)
    {
        printf(<span style="color:#e6db74">&#34;ERROR_SIZE &#34;</span>);
    }
}
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span><span style="color:#75715e">/*---splay---*/</span>

<span style="color:#66d9ef">int</span> n;
<span style="color:#66d9ef">char</span> operator_string[<span style="color:#ae81ff">7</span>];

<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span><span style="color:#66d9ef">int</span> total_size;
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    ll start_time_ <span style="color:#f92672">=</span> clock();
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;editor1.in&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>, stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;editor.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    fread(fread_string, <span style="color:#ae81ff">1</span>, MAXS, stdin);
    init_memory();
    n <span style="color:#f92672">=</span> get_int();
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> n; i<span style="color:#f92672">++</span>)
    {
        get_string(operator_string);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>        printf(<span style="color:#e6db74">&#34;%d SIZE:%d %s &#34;</span>, i, total_size, operator_string);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>        <span style="color:#66d9ef">if</span> (operator_string[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;I&#39;</span>)
        {
            <span style="color:#66d9ef">int</span> m <span style="color:#f92672">=</span> get_int();
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, m);
            total_size <span style="color:#f92672">+=</span> m;
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>            splay_insert(m);
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operator_string[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;M&#39;</span>)
        {
            <span style="color:#66d9ef">int</span> k <span style="color:#f92672">=</span> get_int();
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, k);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>            cur <span style="color:#f92672">=</span> splay_move(k);
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operator_string[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;D&#39;</span>)
        {
            <span style="color:#66d9ef">int</span> m <span style="color:#f92672">=</span> get_int();
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, m);
            total_size <span style="color:#f92672">-=</span> m;
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>            splay_delete(m);
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operator_string[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;G&#39;</span>)
        {
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;n&#34;</span>);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>            splay_get();
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operator_string[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;P&#39;</span>)
        {
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;n&#34;</span>);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>            splay_prev();
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operator_string[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;N&#39;</span>)
        {
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;n&#34;</span>);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>            splay_next();
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operator_string[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;R&#39;</span>)
        {
            <span style="color:#66d9ef">int</span> m <span style="color:#f92672">=</span> get_int();
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>            printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, m);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>            splay_rotate(m);
        }
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>        splay_check();
        printf(<span style="color:#e6db74">&#34;n&#34;</span>);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    }
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    printf(<span style="color:#e6db74">&#34;run time: %lld msn&#34;</span>, clock() <span style="color:#f92672">-</span> start_time_);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    fclose(stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>    fclose(stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
}
</code></pre></div>]]></content></item><item><title>[BZOJ1507][NOI2003]文本编辑器（SPLAY）</title><link>https://www.sxn.dev/posts/noi2003-editor/</link><pubDate>Fri, 02 May 2014 19:16:08 +0000</pubDate><guid>https://www.sxn.dev/posts/noi2003-editor/</guid><description>&lt;p>这题我一开始用块链写的，后来也许是memcpy上的问题本地AC了八中上死活A不掉，后来也就没去改。。几天后学了SPLAY，那就用SPLAY水掉了。&lt;/p>
&lt;p>然后是代码（这个不是蛋疼模板了，我重写的SPLAY）&lt;/p></description><content type="html"><![CDATA[<p>这题我一开始用块链写的，后来也许是memcpy上的问题本地AC了八中上死活A不掉，后来也就没去改。。几天后学了SPLAY，那就用SPLAY水掉了。</p>
<p>然后是代码（这个不是蛋疼模板了，我重写的SPLAY）</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#75715e">//NOI2003 DAY1 editor.cpp splay
</span><span style="color:#75715e"></span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;algorithm&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;iostream&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstring&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdio&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;string&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cmath&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;queue&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;stack&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span>
<span style="color:#75715e">//#define LOCAL
</span><span style="color:#75715e"></span><span style="color:#75715e">#define READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define READ_FILE
</span><span style="color:#75715e">//#define VISUAL_STUDIO
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef VISUAL_STUDIO
</span><span style="color:#75715e">#pragma warning(disable:4996)
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL
</span><span style="color:#75715e">#define LOCAL_TIME
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define LOCAL_DEBUG
</span><span style="color:#75715e">//#define STD_DEBUG
</span><span style="color:#75715e"></span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;ctime&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXS <span style="color:#f92672">=</span> <span style="color:#ae81ff">6</span> <span style="color:#f92672">*</span> <span style="color:#ae81ff">1024</span> <span style="color:#f92672">*</span> <span style="color:#ae81ff">1024</span>;
<span style="color:#66d9ef">char</span> fread_string[MAXS];
<span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>fread_point <span style="color:#f92672">=</span> fread_string;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">get_int</span>()
{
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">while</span> ((<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">&lt;</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">||</span> (<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">&gt;</span> <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        fread_point<span style="color:#f92672">++</span>;
    }
    <span style="color:#66d9ef">while</span> ((<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">&gt;=</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">&lt;=</span> <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        ret <span style="color:#f92672">=</span> ret <span style="color:#f92672">*</span> <span style="color:#ae81ff">10</span> <span style="color:#f92672">+</span> <span style="color:#f92672">*</span>(fread_point<span style="color:#f92672">++</span>) <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;0&#39;</span>;
    }
    <span style="color:#66d9ef">return</span> ret;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">get_string</span>(<span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>input_string)
{
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>    memset(input_string, <span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">7</span>);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">while</span> ((<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39; &#39;</span>) <span style="color:#f92672">||</span> (<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;n&#39;</span>))
    {
        fread_point<span style="color:#f92672">++</span>;
    }
    <span style="color:#66d9ef">int</span> leng <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">while</span> ((<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">!=</span> <span style="color:#e6db74">&#39; &#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">!=</span> <span style="color:#e6db74">&#39;n&#39;</span>))
    {
        input_string[leng<span style="color:#f92672">++</span>] <span style="color:#f92672">=</span> <span style="color:#f92672">*</span>(fread_point<span style="color:#f92672">++</span>);
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">get_insert</span>(<span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>input_string, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> length)
{
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> length; i<span style="color:#f92672">++</span>)
    {
        <span style="color:#66d9ef">while</span> (<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;n&#39;</span>)
        {
            fread_point<span style="color:#f92672">++</span>;
        }
        input_string[i] <span style="color:#f92672">=</span> <span style="color:#f92672">*</span>(fread_point<span style="color:#f92672">++</span>);
    }
}

<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">typedef</span> <span style="color:#66d9ef">long</span> <span style="color:#66d9ef">long</span> ll;

<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXN <span style="color:#f92672">=</span> <span style="color:#ae81ff">2</span> <span style="color:#f92672">*</span> <span style="color:#ae81ff">1024</span> <span style="color:#f92672">*</span> <span style="color:#ae81ff">1024</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">10</span>;

<span style="color:#75715e">/*---recover memory---*/</span>
<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">splay_node</span>
{
    <span style="color:#66d9ef">char</span> val;
    splay_node <span style="color:#f92672">*</span>parent, <span style="color:#f92672">*</span>l_child, <span style="color:#f92672">*</span>r_child;
    <span style="color:#66d9ef">int</span> size;
    <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">init</span>()
    {
        parent <span style="color:#f92672">=</span> l_child <span style="color:#f92672">=</span> r_child <span style="color:#f92672">=</span> NULL;
    }
    splay_node()
    {
        init();
    }
    <span style="color:#f92672">~</span>splay_node()
    {
    }
};

splay_node splay_memory[MAXN];
splay_node <span style="color:#f92672">*</span>memory_stack[MAXN];
<span style="color:#66d9ef">int</span> stack_top;

<span style="color:#66d9ef">void</span> <span style="color:#a6e22e">init_memory</span>()
{
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> MAXN; i<span style="color:#f92672">++</span>)
    {
        memory_stack[i] <span style="color:#f92672">=</span> splay_memory <span style="color:#f92672">+</span> i;
    }
    stack_top <span style="color:#f92672">=</span> MAXN;
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">new_node</span>()
{
    <span style="color:#66d9ef">return</span> memory_stack[<span style="color:#f92672">--</span>stack_top];
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">delete_node</span>(splay_node <span style="color:#f92672">*</span>del_node)
{
    memory_stack[stack_top<span style="color:#f92672">++</span>] <span style="color:#f92672">=</span> del_node;
    del_node<span style="color:#f92672">-&gt;</span>init();
}
<span style="color:#75715e">/*---recover memory---*/</span>

<span style="color:#66d9ef">char</span> insert_string[MAXN];

splay_node <span style="color:#f92672">*</span>head <span style="color:#f92672">=</span> NULL, <span style="color:#f92672">*</span>cur <span style="color:#f92672">=</span> NULL;

<span style="color:#75715e">/*--splay---*/</span>
<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">attach_as_l_child</span>(splay_node <span style="color:#f92672">*</span>parent, splay_node <span style="color:#f92672">*</span>child)
{
    parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> child;
    <span style="color:#66d9ef">if</span> (child <span style="color:#f92672">!=</span> NULL)
    {
        child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">attach_as_r_child</span>(splay_node <span style="color:#f92672">*</span>parent, splay_node <span style="color:#f92672">*</span>child)
{
    parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> child;
    <span style="color:#66d9ef">if</span> (child <span style="color:#f92672">!=</span> NULL)
    {
        child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    }
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">build_splay</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> l, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> r, <span style="color:#66d9ef">int</span> <span style="color:#f92672">*</span>ret_size)
{
    <span style="color:#66d9ef">int</span> mid <span style="color:#f92672">=</span> (l <span style="color:#f92672">+</span> r) <span style="color:#f92672">&gt;&gt;</span> <span style="color:#ae81ff">1</span>;
    splay_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> new_node();
    tmp<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">=</span> insert_string[mid];
    <span style="color:#f92672">*</span>ret_size <span style="color:#f92672">+=</span> <span style="color:#ae81ff">1</span>;
    <span style="color:#66d9ef">if</span> (l <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">==</span> r)
    {
        tmp<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
    }
    <span style="color:#66d9ef">else</span>
    {
        <span style="color:#66d9ef">int</span> size <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
        <span style="color:#66d9ef">if</span> (l <span style="color:#f92672">&lt;</span> mid)
        {
            attach_as_l_child(tmp, build_splay(l, mid, <span style="color:#f92672">&amp;</span>size));
        }
        <span style="color:#66d9ef">if</span> (mid <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">&lt;</span> r)
        {
            attach_as_r_child(tmp, tmp<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> build_splay(mid <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, r, <span style="color:#f92672">&amp;</span>size));
        }
        tmp<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> size <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
        <span style="color:#f92672">*</span>ret_size <span style="color:#f92672">+=</span> size;
    }
    <span style="color:#66d9ef">return</span> tmp;
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_top</span>(splay_node <span style="color:#f92672">*</span>root <span style="color:#f92672">=</span> head)
{
    <span style="color:#66d9ef">for</span> (splay_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> root; tmp <span style="color:#f92672">!=</span> NULL; tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>l_child)
    {
        <span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> NULL)
        {
            <span style="color:#66d9ef">return</span> tmp;
        }
    }
    <span style="color:#66d9ef">return</span> NULL;
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_bottom</span>(splay_node <span style="color:#f92672">*</span>root <span style="color:#f92672">=</span> head)
{
    <span style="color:#66d9ef">for</span> (splay_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> root; tmp <span style="color:#f92672">!=</span> NULL; tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>r_child)
    {
        <span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">==</span> NULL)
        {
            <span style="color:#66d9ef">return</span> tmp;
        }
    }
    <span style="color:#66d9ef">return</span> NULL;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zig</span>(splay_node <span style="color:#f92672">*</span>axis)
{
    splay_node <span style="color:#f92672">*</span>left_child <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>l_child;
    splay_node <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>parent;
    left_child<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>size;
    axis<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> (left_child<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> left_child<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> (axis<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> axis<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
    attach_as_l_child(axis, left_child<span style="color:#f92672">-&gt;</span>r_child);
    attach_as_r_child(left_child, axis);
    left_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    <span style="color:#66d9ef">if</span> (parent <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> axis)
        {
            attach_as_l_child(parent, left_child);
        }
        <span style="color:#66d9ef">else</span>
        {
            attach_as_r_child(parent, left_child);
        }
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zag</span>(splay_node <span style="color:#f92672">*</span>axis)
{
    splay_node <span style="color:#f92672">*</span>right_child <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>r_child;
    splay_node <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>parent;
    right_child<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>size;
    axis<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">=</span> (right_child<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> right_child<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> (axis<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> axis<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
    attach_as_r_child(axis, right_child<span style="color:#f92672">-&gt;</span>l_child);
    attach_as_l_child(right_child, axis);
    right_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    <span style="color:#66d9ef">if</span> (parent <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> axis)
        {
            attach_as_l_child(parent, right_child);
        }
        <span style="color:#66d9ef">else</span>
        {
            attach_as_r_child(parent, right_child);
        }
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zig_zig</span>(splay_node <span style="color:#f92672">*</span>axis)
{
    zig(axis<span style="color:#f92672">-&gt;</span>l_child);
    zig(axis);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zag_zag</span>(splay_node <span style="color:#f92672">*</span>axis)
{
    zag(axis<span style="color:#f92672">-&gt;</span>r_child);
    zag(axis);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zig_zag</span>(splay_node <span style="color:#f92672">*</span>axis)
{
    zig(axis<span style="color:#f92672">-&gt;</span>r_child);
    zag(axis);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zag_zig</span>(splay_node <span style="color:#f92672">*</span>axis)
{
    zag(axis<span style="color:#f92672">-&gt;</span>l_child);
    zig(axis);
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_route</span>(splay_node <span style="color:#f92672">*</span>v)
{
    splay_node <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> NULL, <span style="color:#f92672">*</span>grandparent <span style="color:#f92672">=</span> NULL;
    <span style="color:#66d9ef">while</span> (((parent <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>parent) <span style="color:#f92672">!=</span> NULL) <span style="color:#f92672">&amp;&amp;</span> ((grandparent <span style="color:#f92672">=</span> parent<span style="color:#f92672">-&gt;</span>parent) <span style="color:#f92672">!=</span> NULL))
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> v)
        {
            <span style="color:#66d9ef">if</span> (grandparent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> parent)
            {
                zig_zig(grandparent);
            }
            <span style="color:#66d9ef">else</span>
            {
                zig_zag(grandparent);
            }
        }
        <span style="color:#66d9ef">else</span>
        {
            <span style="color:#66d9ef">if</span> (grandparent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">==</span> parent)
            {
                zag_zag(grandparent);
            }
            <span style="color:#66d9ef">else</span>
            {
                zag_zig(grandparent);
            }
        }
    }
    <span style="color:#66d9ef">if</span> ((parent <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>parent) <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> v)
        {
            zig(parent);
        }
        <span style="color:#66d9ef">else</span>
        {
            zag(parent);
        }
    }
    <span style="color:#66d9ef">return</span> v;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_insert</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> length)
{
    get_insert(insert_string, length);
    <span style="color:#66d9ef">int</span> size <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    splay_node <span style="color:#f92672">*</span>root <span style="color:#f92672">=</span> build_splay(<span style="color:#ae81ff">0</span>, length, <span style="color:#f92672">&amp;</span>size);
    <span style="color:#66d9ef">if</span> (head <span style="color:#f92672">==</span> NULL)
    {
        head <span style="color:#f92672">=</span> root;
    }
    <span style="color:#66d9ef">else</span>
    {
        <span style="color:#66d9ef">if</span> (cur <span style="color:#f92672">==</span> NULL)
        {
            head <span style="color:#f92672">=</span> splay_route(splay_top());
            attach_as_l_child(head, root);
            head<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>size;
        }
        <span style="color:#66d9ef">else</span>
        {
            head <span style="color:#f92672">=</span> splay_route(cur);
            <span style="color:#66d9ef">if</span> (head<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL)
            {
                head<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> NULL;
                splay_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> splay_route(splay_top(head<span style="color:#f92672">-&gt;</span>r_child));
                attach_as_r_child(head, tmp);
                attach_as_l_child(tmp, root);
                tmp<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>size;
                head<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>size;
            }
            <span style="color:#66d9ef">else</span>
            {
                attach_as_r_child(head, root);
                head<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">+=</span> root<span style="color:#f92672">-&gt;</span>size;
            }
        }
    }
}

<span style="color:#66d9ef">inline</span> splay_node <span style="color:#f92672">*</span><span style="color:#a6e22e">splay_move</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> move_id, splay_node <span style="color:#f92672">*</span>root <span style="color:#f92672">=</span> head)
{
    <span style="color:#66d9ef">if</span> (move_id <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>)
    {
        <span style="color:#66d9ef">return</span> NULL;
    }
    <span style="color:#66d9ef">int</span> total_size <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">for</span> (splay_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> root; tmp <span style="color:#f92672">!=</span> NULL;)
    {
        <span style="color:#66d9ef">if</span> (total_size <span style="color:#f92672">+</span> (tmp<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> tmp<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">==</span> move_id)
        {
            <span style="color:#66d9ef">return</span> tmp;
            <span style="color:#66d9ef">break</span>;
        }
        <span style="color:#66d9ef">if</span> (total_size <span style="color:#f92672">+</span> (tmp<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> tmp<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">&lt;</span> move_id)
        {
            total_size <span style="color:#f92672">+=</span> (tmp<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> tmp<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>r_child;
        }
        <span style="color:#66d9ef">else</span>
        {
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>l_child;
        }
    }
    <span style="color:#66d9ef">return</span> NULL;
}

<span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_remove</span>(splay_node <span style="color:#f92672">*</span> remove_root)
{
    <span style="color:#66d9ef">if</span> (remove_root <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span>;
    }
    <span style="color:#66d9ef">if</span> (remove_root<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL)
    {
        splay_remove(remove_root<span style="color:#f92672">-&gt;</span>l_child);
    }
    <span style="color:#66d9ef">if</span> (remove_root<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL)
    {
        splay_remove(remove_root<span style="color:#f92672">-&gt;</span>r_child);
    }
    delete_node(remove_root);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_delete</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> length)
{
    <span style="color:#66d9ef">if</span> (cur <span style="color:#f92672">!=</span> NULL)
    {
        head <span style="color:#f92672">=</span> splay_route(cur);
        <span style="color:#66d9ef">if</span> (head<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">&gt;</span> length)
        {
            head<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> NULL;
            splay_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> splay_route(splay_move(length <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, head<span style="color:#f92672">-&gt;</span>r_child));
            attach_as_r_child(head, tmp);
            tmp<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">-=</span> tmp<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size;
            head<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">-=</span> tmp<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size;
            tmp<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> NULL;
            splay_remove(tmp<span style="color:#f92672">-&gt;</span>l_child);
        }
        <span style="color:#66d9ef">else</span>
        {
            head<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">-=</span> length;
            splay_remove(head<span style="color:#f92672">-&gt;</span>r_child);
            head<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> NULL;
        }
    }
    <span style="color:#66d9ef">else</span>
    {
        <span style="color:#66d9ef">if</span> (head<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">&gt;</span> length)
        {
            head <span style="color:#f92672">=</span> splay_route(splay_move(length <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>));
            head<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">-=</span> length;
            splay_remove(head<span style="color:#f92672">-&gt;</span>l_child);
            head<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> NULL;
        }
        <span style="color:#66d9ef">else</span>
        {
            splay_remove(head);
            head <span style="color:#f92672">=</span> NULL;
        }
    }
}

<span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_print</span>(splay_node <span style="color:#f92672">*</span>root)
{
    <span style="color:#66d9ef">if</span> (root <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span>;
    }
    <span style="color:#66d9ef">if</span> (root<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL)
    {
        splay_print(root<span style="color:#f92672">-&gt;</span>l_child);
    }
    printf(<span style="color:#e6db74">&#34;%c&#34;</span>, root<span style="color:#f92672">-&gt;</span>val);
    <span style="color:#66d9ef">if</span> (root<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL)
    {
        splay_print(root<span style="color:#f92672">-&gt;</span>r_child);
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_get</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> length)
{
    <span style="color:#66d9ef">if</span> (cur <span style="color:#f92672">!=</span> NULL)
    {
        head <span style="color:#f92672">=</span> splay_route(cur);
        <span style="color:#66d9ef">if</span> (head<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">&gt;</span> length)
        {
            head<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> NULL;
            splay_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> splay_route(splay_move(length <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, head<span style="color:#f92672">-&gt;</span>r_child));
            attach_as_r_child(head, tmp);
            splay_print(tmp<span style="color:#f92672">-&gt;</span>l_child);
        }
        <span style="color:#66d9ef">else</span>
        {
            splay_print(head<span style="color:#f92672">-&gt;</span>r_child);
        }
    }
    <span style="color:#66d9ef">else</span>
    {
        <span style="color:#66d9ef">if</span> (head<span style="color:#f92672">-&gt;</span>size <span style="color:#f92672">&gt;</span> length)
        {
            head <span style="color:#f92672">=</span> splay_route(splay_move(length <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>));
            splay_print(head<span style="color:#f92672">-&gt;</span>l_child);
        }
        <span style="color:#66d9ef">else</span>
        {
            splay_print(head);
        }
    }
    printf(<span style="color:#e6db74">&#34;n&#34;</span>);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_prev</span>()
{
    head <span style="color:#f92672">=</span> splay_route(cur);
    cur <span style="color:#f92672">=</span> splay_bottom(head<span style="color:#f92672">-&gt;</span>l_child);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_next</span>()
{
    <span style="color:#66d9ef">if</span> (cur <span style="color:#f92672">==</span> NULL)
    {
        cur <span style="color:#f92672">=</span> head <span style="color:#f92672">=</span> splay_route(splay_top());
    }
    <span style="color:#66d9ef">else</span>
    {
        head <span style="color:#f92672">=</span> splay_route(cur);
        cur <span style="color:#f92672">=</span> splay_top(head<span style="color:#f92672">-&gt;</span>r_child);
    }
}

<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span><span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_check</span>(splay_node <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> NULL)
{
    <span style="color:#66d9ef">if</span> (parent <span style="color:#f92672">==</span> NULL)
    {
        parent <span style="color:#f92672">=</span> head;
    }
    <span style="color:#66d9ef">if</span> (parent <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span>;
    }
    <span style="color:#66d9ef">int</span> size <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
    <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">!=</span> parent)
        {
            printf(<span style="color:#e6db74">&#34;ERROR &#34;</span>);
        }
        size <span style="color:#f92672">+=</span> parent<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>size;
        splay_check(parent<span style="color:#f92672">-&gt;</span>l_child);
    }
    printf(<span style="color:#e6db74">&#34;%c&#34;</span>, parent<span style="color:#f92672">-&gt;</span>val);
    <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">!=</span> parent)
        {
            printf(<span style="color:#e6db74">&#34;ERROR &#34;</span>);
        }
        size <span style="color:#f92672">+=</span> parent<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>size;
        splay_check(parent<span style="color:#f92672">-&gt;</span>r_child);
    }
    <span style="color:#66d9ef">if</span> (size <span style="color:#f92672">!=</span> parent<span style="color:#f92672">-&gt;</span>size)
    {
        printf(<span style="color:#e6db74">&#34;ERROR_SIZE &#34;</span>);
    }
}
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span><span style="color:#75715e">/*---splay---*/</span>

<span style="color:#66d9ef">int</span> n;
<span style="color:#66d9ef">char</span> operator_string[<span style="color:#ae81ff">7</span>];

<span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    ll start_time_ <span style="color:#f92672">=</span> clock();
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;editor.in&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>, stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;editor.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    fread(fread_string, <span style="color:#ae81ff">1</span>, MAXS, stdin);
    init_memory();
    n <span style="color:#f92672">=</span> get_int();
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> n; i<span style="color:#f92672">++</span>)
    {
        get_string(operator_string);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>        printf(<span style="color:#e6db74">&#34;%sn&#34;</span>, operator_string);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>        <span style="color:#66d9ef">if</span> (operator_string[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;I&#39;</span>)
        {
            <span style="color:#66d9ef">int</span> m <span style="color:#f92672">=</span> get_int();
            splay_insert(m);
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operator_string[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;M&#39;</span>)
        {
            <span style="color:#66d9ef">int</span> k <span style="color:#f92672">=</span> get_int();
            cur <span style="color:#f92672">=</span> splay_move(k);
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operator_string[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;D&#39;</span>)
        {
            <span style="color:#66d9ef">int</span> m <span style="color:#f92672">=</span> get_int();
            splay_delete(m);
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operator_string[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;G&#39;</span>)
        {
            <span style="color:#66d9ef">int</span> m <span style="color:#f92672">=</span> get_int();
            splay_get(m);
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operator_string[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;P&#39;</span>)
        {
            splay_prev();
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operator_string[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;N&#39;</span>)
        {
            splay_next();
        }
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>        splay_check();
        printf(<span style="color:#e6db74">&#34;n&#34;</span>);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    }
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    printf(<span style="color:#e6db74">&#34;run time: %lld msn&#34;</span>, clock() <span style="color:#f92672">-</span> start_time_);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    fclose(stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>    fclose(stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
}
</code></pre></div>]]></content></item><item><title>[BZOJ1861][ZJOI2006]书架（SPLAY）</title><link>https://www.sxn.dev/posts/zjoi2006-book/</link><pubDate>Fri, 02 May 2014 18:24:46 +0000</pubDate><guid>https://www.sxn.dev/posts/zjoi2006-book/</guid><description>&lt;p>听说标程是树状数组，听说树状数组跑得可快了。。好吧拿这题来学SPLAY的确有点做死不过也还算裸&lt;/p>
&lt;p>SPLAY要维护的东西很清楚，就是要单独开个数组指向SPLAY上每个节点，以方便根据编号找节点。&lt;/p></description><content type="html"><![CDATA[<p>听说标程是树状数组，听说树状数组跑得可快了。。好吧拿这题来学SPLAY的确有点做死不过也还算裸</p>
<p>SPLAY要维护的东西很清楚，就是要单独开个数组指向SPLAY上每个节点，以方便根据编号找节点。</p>
<p>然后就是贴代码了，一如既往的长</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#75715e">//test splay ADT
</span><span style="color:#75715e"></span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;algorithm&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;iostream&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstring&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdio&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;string&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cmath&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;queue&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;stack&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#define MAXN 80010
</span><span style="color:#75715e"></span>
<span style="color:#75715e">//#define LOCAL
</span><span style="color:#75715e">//#define VISUAL_STUDIO
</span><span style="color:#75715e">//#define READ_FILE
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL
</span><span style="color:#75715e">#define LOCAL_TIME
</span><span style="color:#75715e">#define LOCAL_DEBUG
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define DEBUG_STD
</span><span style="color:#75715e"></span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef VISUAL_STUDIO
</span><span style="color:#75715e">#pragma warning(disable:4996)
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;ctime&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">typedef</span> <span style="color:#66d9ef">long</span> <span style="color:#66d9ef">long</span> ll;

<span style="color:#66d9ef">int</span> n, m, id[MAXN], k;
<span style="color:#66d9ef">char</span> operation_string[<span style="color:#ae81ff">7</span>];

<span style="color:#75715e">//ADT splay
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifndef NULL
</span><span style="color:#75715e">#define NULL 0
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">template</span> <span style="color:#f92672">&lt;</span><span style="color:#66d9ef">typename</span> SPLAY_VAL<span style="color:#f92672">&gt;</span>
<span style="color:#66d9ef">class</span> <span style="color:#a6e22e">splay_node</span>
{
<span style="color:#66d9ef">public</span><span style="color:#f92672">:</span>
    SPLAY_VAL _value;
    splay_node <span style="color:#f92672">*</span>_parent, <span style="color:#f92672">*</span>_l_child, <span style="color:#f92672">*</span>_r_child;
    <span style="color:#66d9ef">int</span> _size;
    <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">init</span>()
    {
        _parent <span style="color:#f92672">=</span> _l_child <span style="color:#f92672">=</span> _r_child <span style="color:#f92672">=</span> NULL;
        _size <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    }
    splay_node()
    {
        init();
    }

    <span style="color:#f92672">~</span>splay_node()
    {
        _parent <span style="color:#f92672">=</span> _l_child <span style="color:#f92672">=</span> _r_child <span style="color:#f92672">=</span> NULL;
    }
};

splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> _mem_node[MAXN], <span style="color:#f92672">*</span>_mem_stack[MAXN];
splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>_id[MAXN];
<span style="color:#66d9ef">int</span> _stack_top;

<span style="color:#66d9ef">template</span> <span style="color:#f92672">&lt;</span><span style="color:#66d9ef">typename</span> SPLAY_VAL<span style="color:#f92672">&gt;</span>
<span style="color:#66d9ef">class</span> <span style="color:#a6e22e">splay</span>
{
<span style="color:#66d9ef">private</span><span style="color:#f92672">:</span>
    splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>_head;
    <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">_init_mem_stack</span>()
    {
        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> MAXN; i<span style="color:#f92672">++</span>)
        {
            _mem_stack[i] <span style="color:#f92672">=</span> _mem_node <span style="color:#f92672">+</span> i;
        }
        _stack_top <span style="color:#f92672">=</span> MAXN;
    }
    splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>_new_node()
    {
        <span style="color:#66d9ef">return</span> _mem_stack[<span style="color:#f92672">--</span>_stack_top];
    }
    <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">_delete_node</span>(splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>delete_node)
    {
        _mem_stack[_stack_top<span style="color:#f92672">++</span>] <span style="color:#f92672">=</span> delete_node;
        delete_node<span style="color:#f92672">-&gt;</span>init();
    }
    <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">attach_as_l_child</span>(splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>parent, splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>child)
    {
        parent<span style="color:#f92672">-&gt;</span>_l_child <span style="color:#f92672">=</span> child;
        <span style="color:#66d9ef">if</span> (child <span style="color:#f92672">!=</span> NULL)
        {
            child<span style="color:#f92672">-&gt;</span>_parent <span style="color:#f92672">=</span> parent;
        }
    }
    <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">attach_as_r_child</span>(splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>parent, splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>child)
    {
        parent<span style="color:#f92672">-&gt;</span>_r_child <span style="color:#f92672">=</span> child;
        <span style="color:#66d9ef">if</span> (child <span style="color:#f92672">!=</span> NULL)
        {
            child<span style="color:#f92672">-&gt;</span>_parent <span style="color:#f92672">=</span> parent;
        }
    }
    <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zig</span>(splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>axis)
    {
        splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>left_child <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>_l_child;
        splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>_parent;
        left_child<span style="color:#f92672">-&gt;</span>_size <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>_size;
        axis<span style="color:#f92672">-&gt;</span>_size <span style="color:#f92672">=</span> (axis<span style="color:#f92672">-&gt;</span>_r_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> axis<span style="color:#f92672">-&gt;</span>_r_child<span style="color:#f92672">-&gt;</span>_size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> (left_child<span style="color:#f92672">-&gt;</span>_r_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> left_child<span style="color:#f92672">-&gt;</span>_r_child<span style="color:#f92672">-&gt;</span>_size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
        attach_as_l_child(axis, left_child<span style="color:#f92672">-&gt;</span>_r_child);
        attach_as_r_child(left_child, axis);
        <span style="color:#66d9ef">if</span> (parent <span style="color:#f92672">==</span> NULL)
        {
            left_child<span style="color:#f92672">-&gt;</span>_parent <span style="color:#f92672">=</span> NULL;
        }
        <span style="color:#66d9ef">else</span>
        {
            <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>_l_child <span style="color:#f92672">==</span> axis)
            {
                attach_as_l_child(parent, left_child);
            }
            <span style="color:#66d9ef">else</span>
            {
                attach_as_r_child(parent, left_child);
            }
        }
    }
    <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zag</span>(splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>axis)
    {
        splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>right_child <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>_r_child;
        splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>_parent;
        right_child<span style="color:#f92672">-&gt;</span>_size <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>_size;
        axis<span style="color:#f92672">-&gt;</span>_size <span style="color:#f92672">=</span> (axis<span style="color:#f92672">-&gt;</span>_l_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> axis<span style="color:#f92672">-&gt;</span>_l_child<span style="color:#f92672">-&gt;</span>_size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> (right_child<span style="color:#f92672">-&gt;</span>_l_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> right_child<span style="color:#f92672">-&gt;</span>_l_child<span style="color:#f92672">-&gt;</span>_size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
        attach_as_r_child(axis, right_child<span style="color:#f92672">-&gt;</span>_l_child);
        attach_as_l_child(right_child, axis);
        <span style="color:#66d9ef">if</span> (parent <span style="color:#f92672">==</span> NULL)
        {
            right_child<span style="color:#f92672">-&gt;</span>_parent <span style="color:#f92672">=</span> NULL;
        }
        <span style="color:#66d9ef">else</span>
        {
            <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>_l_child <span style="color:#f92672">==</span> axis)
            {
                attach_as_l_child(parent, right_child);
            }
            <span style="color:#66d9ef">else</span>
            {
                attach_as_r_child(parent, right_child);
            }
        }
    }
    <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zig_zig</span>(splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>axis)
    {
        zig(axis<span style="color:#f92672">-&gt;</span>_l_child);
        zig(axis);
    }
    <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zag_zag</span>(splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>axis)
    {
        zag(axis<span style="color:#f92672">-&gt;</span>_r_child);
        zag(axis);
    }
    <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zig_zag</span>(splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>axis)
    {
        zig(axis<span style="color:#f92672">-&gt;</span>_r_child);
        zag(axis);
    }
    <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zag_zig</span>(splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>axis)
    {
        zag(axis<span style="color:#f92672">-&gt;</span>_l_child);
        zig(axis);
    }
    splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>find_top(splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>root <span style="color:#f92672">=</span> NULL)
    {
        <span style="color:#66d9ef">for</span> (splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> (root <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> root : _head); tmp <span style="color:#f92672">!=</span> NULL; tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>_l_child)
        {
            <span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>_l_child <span style="color:#f92672">==</span> NULL)
            {
                <span style="color:#66d9ef">return</span> tmp;
            }
        }
        <span style="color:#66d9ef">return</span> NULL;
    }
    splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>find_bottom(splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>root <span style="color:#f92672">=</span> NULL)
    {
        <span style="color:#66d9ef">for</span> (splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> (root <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> root : _head); tmp <span style="color:#f92672">!=</span> NULL; tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>_r_child)
        {
            <span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>_r_child <span style="color:#f92672">==</span> NULL)
            {
                <span style="color:#66d9ef">return</span> tmp;
            }
        }
        <span style="color:#66d9ef">return</span> NULL;
    }
    splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>splay_route(splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>v)
    {
        <span style="color:#66d9ef">if</span> (v <span style="color:#f92672">==</span> NULL)
        {
            <span style="color:#66d9ef">return</span> NULL;
        }
        splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> NULL, <span style="color:#f92672">*</span>grandparent <span style="color:#f92672">=</span> NULL;
        <span style="color:#66d9ef">while</span> (((parent <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>_parent) <span style="color:#f92672">!=</span> NULL) <span style="color:#f92672">&amp;&amp;</span> ((grandparent <span style="color:#f92672">=</span> parent<span style="color:#f92672">-&gt;</span>_parent) <span style="color:#f92672">!=</span> NULL))
        {
            <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>_l_child <span style="color:#f92672">==</span> v)
            {
                <span style="color:#66d9ef">if</span> (grandparent<span style="color:#f92672">-&gt;</span>_l_child <span style="color:#f92672">==</span> parent)
                {
                    zig_zig(grandparent);
                }
                <span style="color:#66d9ef">else</span>
                {
                    zig_zag(grandparent);
                }
            }
            <span style="color:#66d9ef">else</span>
            {
                <span style="color:#66d9ef">if</span> (grandparent<span style="color:#f92672">-&gt;</span>_r_child <span style="color:#f92672">==</span> parent)
                {
                    zag_zag(grandparent);
                }
                <span style="color:#66d9ef">else</span>
                {
                    zag_zig(grandparent);
                }
            }
        }
        <span style="color:#66d9ef">if</span> ((parent <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>_parent) <span style="color:#f92672">!=</span> NULL)
        {
            <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>_l_child <span style="color:#f92672">==</span> v)
            {
                zig(parent);
            }
            <span style="color:#66d9ef">else</span>
            {
                zag(parent);
            }
        }
        v<span style="color:#f92672">-&gt;</span>_parent <span style="color:#f92672">=</span> NULL;
        <span style="color:#66d9ef">return</span> v;
    }
    splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>search_node(SPLAY_VAL value, splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>root <span style="color:#f92672">=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (_head <span style="color:#f92672">==</span> NULL)
        {
            <span style="color:#66d9ef">return</span> NULL;
        }
        splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> (root <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> root : _head);
        splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>last_visit <span style="color:#f92672">=</span> tmp;
        <span style="color:#66d9ef">while</span> ((tmp <span style="color:#f92672">!=</span> NULL) <span style="color:#f92672">&amp;&amp;</span> ((tmp<span style="color:#f92672">-&gt;</span>_value <span style="color:#f92672">&lt;</span> value) <span style="color:#f92672">||</span> (value <span style="color:#f92672">&lt;</span> tmp<span style="color:#f92672">-&gt;</span>_value)))
        {
            last_visit <span style="color:#f92672">=</span> tmp;
            <span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>_value <span style="color:#f92672">&lt;</span> value)
            {
                tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>_r_child;
            }
            <span style="color:#66d9ef">else</span>
            {
                tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>_l_child;
            }
        }
        <span style="color:#66d9ef">if</span> (tmp <span style="color:#f92672">==</span> NULL)
        {
            tmp <span style="color:#f92672">=</span> last_visit;
        }
        <span style="color:#66d9ef">return</span> last_visit;
    }
    splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>init_build(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> l, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> r, <span style="color:#66d9ef">int</span><span style="color:#f92672">*</span> return_size)
    {
        <span style="color:#66d9ef">int</span> mid <span style="color:#f92672">=</span> (l <span style="color:#f92672">+</span> r) <span style="color:#f92672">&gt;&gt;</span> <span style="color:#ae81ff">1</span>;
        <span style="color:#66d9ef">int</span> size <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
        splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> _new_node();
        tmp<span style="color:#f92672">-&gt;</span>_value <span style="color:#f92672">=</span> id[mid];
        _id[id[mid]] <span style="color:#f92672">=</span> tmp;
        <span style="color:#66d9ef">if</span> (l <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">==</span> r)
        {
            <span style="color:#f92672">*</span>return_size <span style="color:#f92672">+=</span> <span style="color:#ae81ff">1</span>;
            tmp<span style="color:#f92672">-&gt;</span>_size <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
        }
        <span style="color:#66d9ef">else</span>
        {
            <span style="color:#66d9ef">if</span> (l <span style="color:#f92672">&lt;</span> mid)
            {
                attach_as_l_child(tmp, init_build(l, mid, <span style="color:#f92672">&amp;</span>size));
            }
            <span style="color:#66d9ef">if</span> (mid <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">&lt;</span> r)
            {
                attach_as_r_child(tmp, init_build(mid <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, r, <span style="color:#f92672">&amp;</span>size));
            }
            <span style="color:#f92672">*</span>return_size <span style="color:#f92672">+=</span> size;
            tmp<span style="color:#f92672">-&gt;</span>_size <span style="color:#f92672">=</span> size;
        }
        <span style="color:#66d9ef">return</span> tmp;
    }
    splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>splay_remove(splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>remove_node)
    {
        <span style="color:#66d9ef">for</span> (splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>loop <span style="color:#f92672">=</span> remove_node<span style="color:#f92672">-&gt;</span>_parent; loop <span style="color:#f92672">!=</span> NULL; loop <span style="color:#f92672">=</span> loop<span style="color:#f92672">-&gt;</span>_parent)
        {
            loop<span style="color:#f92672">-&gt;</span>_size<span style="color:#f92672">--</span>;
        }
        <span style="color:#66d9ef">if</span> (remove_node<span style="color:#f92672">-&gt;</span>_l_child <span style="color:#f92672">==</span> NULL)
        {
            <span style="color:#66d9ef">if</span> (remove_node<span style="color:#f92672">-&gt;</span>_parent <span style="color:#f92672">==</span> NULL)
            {
                _head <span style="color:#f92672">=</span> remove_node<span style="color:#f92672">-&gt;</span>_r_child;
                <span style="color:#66d9ef">if</span> (_head <span style="color:#f92672">!=</span> NULL)
                {
                    _head<span style="color:#f92672">-&gt;</span>_parent <span style="color:#f92672">=</span> NULL;
                }
            }
            <span style="color:#66d9ef">else</span>
            {
                <span style="color:#66d9ef">if</span> (remove_node<span style="color:#f92672">-&gt;</span>_parent<span style="color:#f92672">-&gt;</span>_l_child <span style="color:#f92672">==</span> remove_node)
                {
                    attach_as_l_child(remove_node<span style="color:#f92672">-&gt;</span>_parent, remove_node<span style="color:#f92672">-&gt;</span>_r_child);
                }
                <span style="color:#66d9ef">else</span>
                {
                    attach_as_r_child(remove_node<span style="color:#f92672">-&gt;</span>_parent, remove_node<span style="color:#f92672">-&gt;</span>_r_child);
                }
            }
        }
        <span style="color:#66d9ef">else</span>
        {
            remove_node<span style="color:#f92672">-&gt;</span>_l_child<span style="color:#f92672">-&gt;</span>_parent <span style="color:#f92672">=</span> NULL;
            splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> splay_route(find_bottom(remove_node<span style="color:#f92672">-&gt;</span>_l_child));
            tmp<span style="color:#f92672">-&gt;</span>_size <span style="color:#f92672">+=</span> (remove_node<span style="color:#f92672">-&gt;</span>_r_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> remove_node<span style="color:#f92672">-&gt;</span>_r_child<span style="color:#f92672">-&gt;</span>_size : <span style="color:#ae81ff">0</span>);
            attach_as_r_child(tmp, remove_node<span style="color:#f92672">-&gt;</span>_r_child);
            <span style="color:#66d9ef">if</span> (remove_node<span style="color:#f92672">-&gt;</span>_parent <span style="color:#f92672">==</span> NULL)
            {
                _head <span style="color:#f92672">=</span> tmp;
                tmp<span style="color:#f92672">-&gt;</span>_parent <span style="color:#f92672">=</span> NULL;
            }
            <span style="color:#66d9ef">else</span>
            {
                <span style="color:#66d9ef">if</span> (remove_node<span style="color:#f92672">-&gt;</span>_parent<span style="color:#f92672">-&gt;</span>_l_child <span style="color:#f92672">==</span> remove_node)
                {
                    attach_as_l_child(remove_node<span style="color:#f92672">-&gt;</span>_parent, tmp);
                }
                <span style="color:#66d9ef">else</span>
                {
                    attach_as_r_child(remove_node<span style="color:#f92672">-&gt;</span>_parent, tmp);
                }
            }
        }
        remove_node<span style="color:#f92672">-&gt;</span>_l_child <span style="color:#f92672">=</span> remove_node<span style="color:#f92672">-&gt;</span>_r_child <span style="color:#f92672">=</span> NULL;
        remove_node<span style="color:#f92672">-&gt;</span>_size <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;
        <span style="color:#66d9ef">return</span> remove_node;
    }
    <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_swap</span>(splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>swap_first, splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>swap_second)
    {
        _id[swap_first<span style="color:#f92672">-&gt;</span>_value] <span style="color:#f92672">=</span> swap_second;
        _id[swap_second<span style="color:#f92672">-&gt;</span>_value] <span style="color:#f92672">=</span> swap_first;
        <span style="color:#66d9ef">int</span> tmp <span style="color:#f92672">=</span> swap_first<span style="color:#f92672">-&gt;</span>_value;
        swap_first<span style="color:#f92672">-&gt;</span>_value <span style="color:#f92672">=</span> swap_second<span style="color:#f92672">-&gt;</span>_value;
        swap_second<span style="color:#f92672">-&gt;</span>_value <span style="color:#f92672">=</span> tmp;
    }
<span style="color:#66d9ef">public</span><span style="color:#f92672">:</span>
    splay()
    {
        _head <span style="color:#f92672">=</span> NULL;
        _init_mem_stack();
    }
    <span style="color:#f92672">~</span>splay()
    {
        _head <span style="color:#f92672">=</span> NULL;
    }
    <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_build</span>()
    {
        <span style="color:#66d9ef">int</span> size <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
        _head <span style="color:#f92672">=</span> init_build(<span style="color:#ae81ff">0</span>, n, <span style="color:#f92672">&amp;</span>size);
        _head<span style="color:#f92672">-&gt;</span>_size <span style="color:#f92672">=</span> size;
    }
    <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">splay_query</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> id)
    {
        <span style="color:#66d9ef">int</span> size <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
        splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> _head;
        <span style="color:#66d9ef">for</span> (; tmp <span style="color:#f92672">!=</span> NULL;)
        {
            <span style="color:#66d9ef">if</span> (size <span style="color:#f92672">+</span> (tmp<span style="color:#f92672">-&gt;</span>_l_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> tmp<span style="color:#f92672">-&gt;</span>_l_child<span style="color:#f92672">-&gt;</span>_size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">==</span> id)
            {
                <span style="color:#66d9ef">return</span> tmp<span style="color:#f92672">-&gt;</span>_value;
            }
            <span style="color:#66d9ef">if</span> (size <span style="color:#f92672">+</span> (tmp<span style="color:#f92672">-&gt;</span>_l_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> tmp<span style="color:#f92672">-&gt;</span>_l_child<span style="color:#f92672">-&gt;</span>_size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">&gt;=</span> id)
            {
                tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>_l_child;
            }
            <span style="color:#66d9ef">else</span>
            {
                size <span style="color:#f92672">+=</span> (tmp<span style="color:#f92672">-&gt;</span>_l_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> tmp<span style="color:#f92672">-&gt;</span>_l_child<span style="color:#f92672">-&gt;</span>_size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
                tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>_r_child;
            }
        }
        <span style="color:#66d9ef">if</span> (tmp <span style="color:#f92672">!=</span> NULL)
        {
            _head <span style="color:#f92672">=</span> splay_route(tmp);
        }
        <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
    }
    <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_top</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> id)
    {
        splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> splay_remove(_id[id]);
        splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>top <span style="color:#f92672">=</span> find_top();
        attach_as_l_child(top, tmp);
        <span style="color:#66d9ef">for</span> (splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>loop <span style="color:#f92672">=</span> top; loop <span style="color:#f92672">!=</span> NULL; loop <span style="color:#f92672">=</span> loop<span style="color:#f92672">-&gt;</span>_parent)
        {
            loop<span style="color:#f92672">-&gt;</span>_size<span style="color:#f92672">++</span>;
        }
        _head <span style="color:#f92672">=</span> splay_route(tmp);
    }
    <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_bottom</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> id)
    {
        splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> splay_remove(_id[id]);
        splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>bottom <span style="color:#f92672">=</span> find_bottom();
        attach_as_r_child(bottom, tmp);
        <span style="color:#66d9ef">for</span> (splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>loop <span style="color:#f92672">=</span> bottom; loop <span style="color:#f92672">!=</span> NULL; loop <span style="color:#f92672">=</span> loop<span style="color:#f92672">-&gt;</span>_parent)
        {
            loop<span style="color:#f92672">-&gt;</span>_size<span style="color:#f92672">++</span>;
        }
        _head <span style="color:#f92672">=</span> splay_route(tmp);
    }
    <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_move</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> id, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> shift)
    {
        <span style="color:#66d9ef">if</span> (shift <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>)
        {
            <span style="color:#66d9ef">return</span>;
        }
        splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> _id[id];
        _head <span style="color:#f92672">=</span> splay_route(tmp);
        <span style="color:#66d9ef">if</span> (shift <span style="color:#f92672">==</span> <span style="color:#ae81ff">1</span>)
        {
            splay_swap(tmp, find_top(tmp<span style="color:#f92672">-&gt;</span>_r_child));
        }
        <span style="color:#66d9ef">else</span>
        {
            splay_swap(tmp, find_bottom(tmp<span style="color:#f92672">-&gt;</span>_l_child));
        }
    }
    <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">splay_ask</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> id)
    {
        splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> splay_route(_id[id]);
        _head <span style="color:#f92672">=</span> tmp;
        <span style="color:#66d9ef">return</span> (tmp<span style="color:#f92672">-&gt;</span>_l_child <span style="color:#f92672">==</span> NULL <span style="color:#f92672">?</span> <span style="color:#ae81ff">0</span> <span style="color:#f92672">:</span> tmp<span style="color:#f92672">-&gt;</span>_l_child<span style="color:#f92672">-&gt;</span>_size);
    }
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">debug_size</span>()
    {
        printf(<span style="color:#e6db74">&#34;HEAD_SIZE: %d n&#34;</span>, _head<span style="color:#f92672">-&gt;</span>_size);
    }
    <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">splay_check</span>(splay_node<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (parent <span style="color:#f92672">==</span> NULL)
        {
            parent <span style="color:#f92672">=</span> _head;
        }
        <span style="color:#66d9ef">if</span> ((parent<span style="color:#f92672">-&gt;</span>_l_child <span style="color:#f92672">!=</span> NULL) <span style="color:#f92672">&amp;&amp;</span> (parent<span style="color:#f92672">-&gt;</span>_l_child<span style="color:#f92672">-&gt;</span>_parent <span style="color:#f92672">!=</span> parent))
        {
            printf(<span style="color:#e6db74">&#34;ERROR&#34;</span>);
        }
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>_l_child <span style="color:#f92672">!=</span> NULL)
        {
            splay_check(parent<span style="color:#f92672">-&gt;</span>_l_child);
        }
        printf(<span style="color:#e6db74">&#34;%d &#34;</span>, parent<span style="color:#f92672">-&gt;</span>_value);
        <span style="color:#66d9ef">if</span> ((parent<span style="color:#f92672">-&gt;</span>_r_child <span style="color:#f92672">!=</span> NULL) <span style="color:#f92672">&amp;&amp;</span> (parent<span style="color:#f92672">-&gt;</span>_r_child<span style="color:#f92672">-&gt;</span>_parent <span style="color:#f92672">!=</span> parent))
        {
            printf(<span style="color:#e6db74">&#34;ERROR&#34;</span>);
        }
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>_r_child <span style="color:#f92672">!=</span> NULL)
        {
            splay_check(parent<span style="color:#f92672">-&gt;</span>_r_child);
        }
        <span style="color:#66d9ef">if</span> ((parent<span style="color:#f92672">-&gt;</span>_l_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> parent<span style="color:#f92672">-&gt;</span>_l_child<span style="color:#f92672">-&gt;</span>_size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> (parent<span style="color:#f92672">-&gt;</span>_r_child <span style="color:#f92672">!=</span> NULL <span style="color:#f92672">?</span> parent<span style="color:#f92672">-&gt;</span>_r_child<span style="color:#f92672">-&gt;</span>_size : <span style="color:#ae81ff">0</span>) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">!=</span> parent<span style="color:#f92672">-&gt;</span>_size)
        {
            printf(<span style="color:#e6db74">&#34;SIZE_ERROR&#34;</span>);
            exit(<span style="color:#ae81ff">0</span>);
        }
    }
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>};

<span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    ll start_time_ <span style="color:#f92672">=</span> clock();
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;book.in&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>, stdin);
<span style="color:#75715e">#ifndef DEBUG_STD
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;book.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    splay<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;</span> sp;
    scanf(<span style="color:#e6db74">&#34;%d %d&#34;</span>, <span style="color:#f92672">&amp;</span>n, <span style="color:#f92672">&amp;</span>m);
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> n; i<span style="color:#f92672">++</span>)
    {
        scanf(<span style="color:#e6db74">&#34;%d&#34;</span>, id <span style="color:#f92672">+</span> i);
    }
    sp.splay_build();
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>    sp.debug_size();
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> m; i<span style="color:#f92672">++</span>)
    {
        scanf(<span style="color:#e6db74">&#34;%s %d&#34;</span>, operation_string, <span style="color:#f92672">&amp;</span>k);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>        printf(<span style="color:#e6db74">&#34;%sn&#34;</span>, operation_string);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>        <span style="color:#66d9ef">if</span> (operation_string[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;Q&#39;</span>)
        {
            printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, sp.splay_query(k));
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operation_string[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;T&#39;</span>)
        {
            sp.splay_top(k);
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operation_string[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;B&#39;</span>)
        {
            sp.splay_bottom(k);
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operation_string[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;I&#39;</span>)
        {
            <span style="color:#66d9ef">int</span> shift;
            scanf(<span style="color:#e6db74">&#34;%d&#34;</span>, <span style="color:#f92672">&amp;</span>shift);
            sp.splay_move(k, shift);
        }
        <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (operation_string[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;A&#39;</span>)
        {
            printf(<span style="color:#e6db74">&#34;%dn&#34;</span>, sp.splay_ask(k));
        }
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>        sp.splay_check();
        printf(<span style="color:#e6db74">&#34;n&#34;</span>);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    }
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    printf(<span style="color:#e6db74">&#34;run time: %lld msn&#34;</span>, clock() <span style="color:#f92672">-</span> start_time_);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    fclose(stdin);
<span style="color:#75715e">#ifndef DEBUG_STD
</span><span style="color:#75715e"></span>    fclose(stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
}
</code></pre></div>]]></content></item><item><title>[BZOJ1208][HNOI2004]宠物收养所（treap）</title><link>https://www.sxn.dev/posts/hnoi2004-pet/</link><pubDate>Fri, 02 May 2014 16:57:43 +0000</pubDate><guid>https://www.sxn.dev/posts/hnoi2004-pet/</guid><description>&lt;p>没什么好说的，一道不能更裸的TREAP，TREAP这随机种子真是蛋疼。。直接上代码了（原谅我的代码风格，这代码真是长。。）&lt;/p></description><content type="html"><![CDATA[<p>没什么好说的，一道不能更裸的TREAP，TREAP这随机种子真是蛋疼。。直接上代码了（原谅我的代码风格，这代码真是长。。）</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#75715e">/**************************************************************
</span><span style="color:#75715e">    Problem: 1208
</span><span style="color:#75715e">    User: shenxn
</span><span style="color:#75715e">    Language: C++
</span><span style="color:#75715e">    Result: Accepted
</span><span style="color:#75715e">    Time:92 ms
</span><span style="color:#75715e">    Memory:2416 kb
</span><span style="color:#75715e">****************************************************************/</span>

<span style="color:#75715e">//HNOI2004 DAY1 pet.cpp
</span><span style="color:#75715e"></span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;algorithm&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;iostream&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstring&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdlib&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;string&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cstdio&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;cmath&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;queue&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;stack&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e"></span>
<span style="color:#75715e">//#define LOCAL
</span><span style="color:#75715e"></span><span style="color:#75715e">#define READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define READ_FILE
</span><span style="color:#75715e">//#define VISUAL_STUDIO
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef VISUAL_STUDIO
</span><span style="color:#75715e">#pragma warning(disable:4996)
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL
</span><span style="color:#75715e">#define LOCAL_TIME
</span><span style="color:#75715e">#define LOCAL_DEBUG
</span><span style="color:#75715e"></span><span style="color:#75715e">//#define STD_DEBUG
</span><span style="color:#75715e"></span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e">#include</span><span style="color:#75715e">&lt;ctime&gt;</span><span style="color:#75715e">
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifndef NULL
</span><span style="color:#75715e">#define NULL 0
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span><span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXS <span style="color:#f92672">=</span> <span style="color:#ae81ff">900</span> <span style="color:#f92672">*</span> <span style="color:#ae81ff">1024</span>;

<span style="color:#66d9ef">char</span> fread_string[MAXS];
<span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>fread_point <span style="color:#f92672">=</span> fread_string;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">get_int</span>()
{
    <span style="color:#66d9ef">int</span> ret <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    <span style="color:#66d9ef">while</span> ((<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">&lt;</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">||</span> (<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">&gt;</span> <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        fread_point<span style="color:#f92672">++</span>;
    }
    <span style="color:#66d9ef">while</span> ((<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">&gt;=</span> <span style="color:#e6db74">&#39;0&#39;</span>) <span style="color:#f92672">&amp;&amp;</span> (<span style="color:#f92672">*</span>fread_point <span style="color:#f92672">&lt;=</span> <span style="color:#e6db74">&#39;9&#39;</span>))
    {
        ret <span style="color:#f92672">=</span> ret <span style="color:#f92672">*</span> <span style="color:#ae81ff">10</span> <span style="color:#f92672">+</span> <span style="color:#f92672">*</span>(fread_point<span style="color:#f92672">++</span>) <span style="color:#f92672">-</span> <span style="color:#e6db74">&#39;0&#39;</span>;
    }
    <span style="color:#66d9ef">return</span> ret;
}
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">read</span>(<span style="color:#66d9ef">int</span> <span style="color:#f92672">&amp;</span>read_int)
{
<span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>    read_int <span style="color:#f92672">=</span> get_int();
<span style="color:#75715e">#else
</span><span style="color:#75715e"></span>    scanf(<span style="color:#e6db74">&#34;%d&#34;</span>, <span style="color:#f92672">&amp;</span>read_int);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>}

<span style="color:#66d9ef">typedef</span> <span style="color:#66d9ef">long</span> <span style="color:#66d9ef">long</span> ll;

<span style="color:#66d9ef">int</span> n, operator_num, special_num;
<span style="color:#66d9ef">int</span> total_pet, total_person;

<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> OP_PET <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>, OP_PERSON <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>;

<span style="color:#66d9ef">struct</span> <span style="color:#a6e22e">treap_node</span>
{
    <span style="color:#66d9ef">int</span> val, rank;
    treap_node <span style="color:#f92672">*</span>l_child, <span style="color:#f92672">*</span>r_child, <span style="color:#f92672">*</span>parent;
    <span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">init</span>()
    {
        val <span style="color:#f92672">=</span> rank <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
        l_child <span style="color:#f92672">=</span> r_child <span style="color:#f92672">=</span> parent <span style="color:#f92672">=</span> NULL;
    }
    <span style="color:#66d9ef">inline</span> <span style="color:#a6e22e">treap_node</span>()
    {
        init();
    }
};

<span style="color:#75715e">/*---recover memory---*/</span>
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MAXN <span style="color:#f92672">=</span> <span style="color:#ae81ff">10000</span>;

treap_node node_memory[MAXN];
treap_node <span style="color:#f92672">*</span>memory_stack[MAXN];
<span style="color:#66d9ef">int</span> top_stack;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">init_memory</span>()
{
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> MAXN; i<span style="color:#f92672">++</span>)
    {
        memory_stack[i] <span style="color:#f92672">=</span> node_memory <span style="color:#f92672">+</span> i;
    }
    top_stack <span style="color:#f92672">=</span> MAXN;
}

<span style="color:#66d9ef">inline</span> treap_node <span style="color:#f92672">*</span><span style="color:#a6e22e">new_node</span>()
{
    <span style="color:#66d9ef">return</span> memory_stack[<span style="color:#f92672">--</span>top_stack];
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">delete_node</span>(treap_node <span style="color:#f92672">*</span>del_node)
{
    memory_stack[top_stack<span style="color:#f92672">++</span>] <span style="color:#f92672">=</span> del_node;
    del_node<span style="color:#f92672">-&gt;</span>init();
}
<span style="color:#75715e">/*---recover memory---*/</span>

treap_node <span style="color:#f92672">*</span>head;

<span style="color:#75715e">/*---rank---*/</span>
<span style="color:#66d9ef">int</span> rank_sum;

<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> rank_base <span style="color:#f92672">=</span> <span style="color:#ae81ff">854</span>;

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">get_rank</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
    <span style="color:#66d9ef">if</span> (rank_sum <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>)
    {
        srand(val <span style="color:#f92672">+</span> rank_base <span style="color:#f92672">+</span> rand());
    }
    rank_sum<span style="color:#f92672">++</span>;
    <span style="color:#66d9ef">if</span> (rank_sum <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">30</span>)
    {
        rank_sum <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
    }
    <span style="color:#66d9ef">return</span> (rand() <span style="color:#f92672">&lt;&lt;</span> <span style="color:#ae81ff">11</span>) <span style="color:#f92672">+</span> rand();
}
<span style="color:#75715e">/*---rank---*/</span>

<span style="color:#75715e">/*---treap---*/</span>
<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">attach_as_l_child</span>(treap_node <span style="color:#f92672">*</span>parent, treap_node <span style="color:#f92672">*</span>child)
{
    parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> child;
    <span style="color:#66d9ef">if</span> (child <span style="color:#f92672">!=</span> NULL)
    {
        child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">attach_as_r_child</span>(treap_node <span style="color:#f92672">*</span>parent, treap_node <span style="color:#f92672">*</span>child)
{
    parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> child;
    <span style="color:#66d9ef">if</span> (child <span style="color:#f92672">!=</span> NULL)
    {
        child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zig</span>(treap_node <span style="color:#f92672">*</span>axis)
{
    treap_node <span style="color:#f92672">*</span>left_child <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>l_child;
    treap_node <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>parent;
    attach_as_l_child(axis, left_child<span style="color:#f92672">-&gt;</span>r_child);
    attach_as_r_child(left_child, axis);
    left_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    <span style="color:#66d9ef">if</span> (parent <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> axis)
        {
            parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> left_child;
        }
        <span style="color:#66d9ef">else</span>
        {
            parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> left_child;
        }
    }
    <span style="color:#66d9ef">else</span>
    {
        head <span style="color:#f92672">=</span> left_child;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">zag</span>(treap_node <span style="color:#f92672">*</span>axis)
{
    treap_node <span style="color:#f92672">*</span>right_child <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>r_child;
    treap_node <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> axis<span style="color:#f92672">-&gt;</span>parent;
    attach_as_r_child(axis, right_child<span style="color:#f92672">-&gt;</span>l_child);
    attach_as_l_child(right_child, axis);
    right_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> parent;
    <span style="color:#66d9ef">if</span> (parent <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> axis)
        {
            parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">=</span> right_child;
        }
        <span style="color:#66d9ef">else</span>
        {
            parent<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">=</span> right_child;
        }
    }
    <span style="color:#66d9ef">else</span>
    {
        head <span style="color:#f92672">=</span> right_child;
    }
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">treap_route</span>(treap_node <span style="color:#f92672">*</span>v)
{
    treap_node <span style="color:#f92672">*</span>parent;
    <span style="color:#66d9ef">while</span> (((parent <span style="color:#f92672">=</span> v<span style="color:#f92672">-&gt;</span>parent) <span style="color:#f92672">!=</span> NULL) <span style="color:#f92672">&amp;&amp;</span> (v<span style="color:#f92672">-&gt;</span>rank <span style="color:#f92672">&lt;</span> parent<span style="color:#f92672">-&gt;</span>rank))
    {
        <span style="color:#66d9ef">if</span> (parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> v)
        {
            zig(parent);
        }
        <span style="color:#66d9ef">else</span>
        {
            zag(parent);
        }
    }
}

<span style="color:#66d9ef">inline</span> treap_node <span style="color:#f92672">*</span><span style="color:#a6e22e">cmp_s</span>(treap_node <span style="color:#f92672">*</span>a, treap_node <span style="color:#f92672">*</span>b, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
    <span style="color:#66d9ef">if</span> (b<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">&gt;=</span> val)
    {
        <span style="color:#66d9ef">return</span> a;
    }
    <span style="color:#66d9ef">if</span> (a <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span> b;
    }
    <span style="color:#66d9ef">if</span> (a<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">&lt;</span> b<span style="color:#f92672">-&gt;</span>val)
    {
        <span style="color:#66d9ef">return</span> b;
    }
    <span style="color:#66d9ef">return</span> a;
}

<span style="color:#66d9ef">inline</span> treap_node <span style="color:#f92672">*</span><span style="color:#a6e22e">cmp_b</span>(treap_node <span style="color:#f92672">*</span>a, treap_node <span style="color:#f92672">*</span>b, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
    <span style="color:#66d9ef">if</span> (b<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">&lt;=</span> val)
    {
        <span style="color:#66d9ef">return</span> a;
    }
    <span style="color:#66d9ef">if</span> (a <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">return</span> b;
    }
    <span style="color:#66d9ef">if</span> (a<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">&gt;</span> b<span style="color:#f92672">-&gt;</span>val)
    {
        <span style="color:#66d9ef">return</span> b;
    }
    <span style="color:#66d9ef">return</span> a;
}

<span style="color:#66d9ef">inline</span> treap_node <span style="color:#f92672">*</span><span style="color:#a6e22e">treap_find</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val, treap_node <span style="color:#f92672">*</span>(<span style="color:#f92672">*</span>cmp)(treap_node<span style="color:#f92672">*</span>, treap_node<span style="color:#f92672">*</span>, <span style="color:#66d9ef">int</span>) <span style="color:#f92672">=</span> NULL)
{
    treap_node <span style="color:#f92672">*</span>last_visit <span style="color:#f92672">=</span> head;
    treap_node <span style="color:#f92672">*</span>min_max <span style="color:#f92672">=</span> NULL;
    <span style="color:#66d9ef">for</span> (treap_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> head; tmp <span style="color:#f92672">!=</span> NULL;)
    {
        <span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">==</span> val)
        {
            <span style="color:#66d9ef">return</span> tmp;
        }
        <span style="color:#66d9ef">if</span> (cmp <span style="color:#f92672">!=</span> NULL)
        {
            min_max <span style="color:#f92672">=</span> cmp(min_max, tmp, val);
        }
        last_visit <span style="color:#f92672">=</span> tmp;
        <span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">&gt;</span> val)
        {
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>l_child;
        }
        <span style="color:#66d9ef">else</span>
        {
            tmp <span style="color:#f92672">=</span> tmp<span style="color:#f92672">-&gt;</span>r_child;
        }
    }
    <span style="color:#66d9ef">if</span> (cmp <span style="color:#f92672">!=</span> NULL)
    {
        <span style="color:#66d9ef">return</span> min_max;
    }
    <span style="color:#66d9ef">return</span> last_visit;
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">treap_insert</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
    treap_node <span style="color:#f92672">*</span>insert_node <span style="color:#f92672">=</span> new_node();
    insert_node<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">=</span> val;
    insert_node<span style="color:#f92672">-&gt;</span>rank <span style="color:#f92672">=</span> get_rank(val);
    <span style="color:#66d9ef">if</span> (head <span style="color:#f92672">==</span> NULL)
    {
        head <span style="color:#f92672">=</span> insert_node;
        <span style="color:#66d9ef">return</span>;
    }
    treap_node <span style="color:#f92672">*</span>tmp <span style="color:#f92672">=</span> treap_find(val);
    <span style="color:#66d9ef">if</span> (tmp<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">&gt;</span> val)
    {
        attach_as_l_child(tmp, insert_node);
    }
    <span style="color:#66d9ef">else</span>
    {
        attach_as_r_child(tmp, insert_node);
    }
    treap_route(insert_node);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">treap_remove</span>(treap_node <span style="color:#f92672">*</span>remove_node)
{
    <span style="color:#66d9ef">while</span> ((remove_node<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL) <span style="color:#f92672">&amp;&amp;</span> (remove_node<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL))
    {
        <span style="color:#66d9ef">if</span> (remove_node<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">&lt;</span> remove_node<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>val)
        {
            zig(remove_node);
        }
        <span style="color:#66d9ef">else</span>
        {
            zag(remove_node);
        }
    }
    <span style="color:#66d9ef">if</span> (remove_node<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">if</span> (remove_node<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL)
        {
            head <span style="color:#f92672">=</span> remove_node<span style="color:#f92672">-&gt;</span>l_child;
            remove_node<span style="color:#f92672">-&gt;</span>l_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> NULL;
        }
        <span style="color:#66d9ef">else</span>
        {
            head <span style="color:#f92672">=</span> remove_node<span style="color:#f92672">-&gt;</span>r_child;
            <span style="color:#66d9ef">if</span> (remove_node<span style="color:#f92672">-&gt;</span>r_child <span style="color:#f92672">!=</span> NULL)
            {
                remove_node<span style="color:#f92672">-&gt;</span>r_child<span style="color:#f92672">-&gt;</span>parent <span style="color:#f92672">=</span> NULL;
            }
        }
    }
    <span style="color:#66d9ef">else</span>
    {
        <span style="color:#66d9ef">if</span> (remove_node<span style="color:#f92672">-&gt;</span>parent<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">==</span> remove_node)
        {
            <span style="color:#66d9ef">if</span> (remove_node<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL)
            {
                attach_as_l_child(remove_node<span style="color:#f92672">-&gt;</span>parent, remove_node<span style="color:#f92672">-&gt;</span>l_child);
            }
            <span style="color:#66d9ef">else</span>
            {
                attach_as_l_child(remove_node<span style="color:#f92672">-&gt;</span>parent, remove_node<span style="color:#f92672">-&gt;</span>r_child);
            }
        }
        <span style="color:#66d9ef">else</span>
        {
            <span style="color:#66d9ef">if</span> (remove_node<span style="color:#f92672">-&gt;</span>l_child <span style="color:#f92672">!=</span> NULL)
            {
                attach_as_r_child(remove_node<span style="color:#f92672">-&gt;</span>parent, remove_node<span style="color:#f92672">-&gt;</span>l_child);
            }
            <span style="color:#66d9ef">else</span>
            {
                attach_as_r_child(remove_node<span style="color:#f92672">-&gt;</span>parent, remove_node<span style="color:#f92672">-&gt;</span>r_child);
            }
        }
    }
    delete_node(remove_node);
}

<span style="color:#66d9ef">inline</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">treap_delete</span>(<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> val)
{
    treap_node <span style="color:#f92672">*</span>s_node <span style="color:#f92672">=</span> treap_find(val, cmp_s);
    <span style="color:#66d9ef">if</span> ((s_node <span style="color:#f92672">!=</span> NULL) <span style="color:#f92672">&amp;&amp;</span> (s_node<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">==</span> val))
    {
        treap_remove(s_node);
        <span style="color:#66d9ef">return</span> val;
    }
    treap_node <span style="color:#f92672">*</span>b_node <span style="color:#f92672">=</span> treap_find(val, cmp_b);
    <span style="color:#66d9ef">if</span> (s_node <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">int</span> value <span style="color:#f92672">=</span> b_node<span style="color:#f92672">-&gt;</span>val;
        treap_remove(b_node);
        <span style="color:#66d9ef">return</span> value;
    }
    <span style="color:#66d9ef">if</span> (b_node <span style="color:#f92672">==</span> NULL)
    {
        <span style="color:#66d9ef">int</span> value <span style="color:#f92672">=</span> s_node<span style="color:#f92672">-&gt;</span>val;
        treap_remove(s_node);
        <span style="color:#66d9ef">return</span> value;
    }
    <span style="color:#66d9ef">if</span> (b_node<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">-</span> val <span style="color:#f92672">==</span> val <span style="color:#f92672">-</span> s_node<span style="color:#f92672">-&gt;</span>val)
    {
        <span style="color:#66d9ef">int</span> value <span style="color:#f92672">=</span> s_node<span style="color:#f92672">-&gt;</span>val;
        treap_remove(s_node);
        <span style="color:#66d9ef">return</span> value;
    }
    <span style="color:#66d9ef">if</span> (b_node<span style="color:#f92672">-&gt;</span>val <span style="color:#f92672">-</span> val <span style="color:#f92672">&lt;</span> val <span style="color:#f92672">-</span> s_node<span style="color:#f92672">-&gt;</span>val)
    {
        <span style="color:#66d9ef">int</span> value <span style="color:#f92672">=</span> b_node<span style="color:#f92672">-&gt;</span>val;
        treap_remove(b_node);
        <span style="color:#66d9ef">return</span> value;
    }
    <span style="color:#66d9ef">else</span>
    {
        <span style="color:#66d9ef">int</span> value <span style="color:#f92672">=</span> s_node<span style="color:#f92672">-&gt;</span>val;
        treap_remove(s_node);
        <span style="color:#66d9ef">return</span> value;
    }
}
<span style="color:#75715e">/*---treap---*/</span>

<span style="color:#66d9ef">int</span> ans;
<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">int</span> MOD <span style="color:#f92672">=</span> <span style="color:#ae81ff">1000000</span>;

<span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>()
{
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    ll start_time_ <span style="color:#f92672">=</span> clock();
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;pet.in&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>, stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>    freopen(<span style="color:#e6db74">&#34;pet.out&#34;</span>, <span style="color:#e6db74">&#34;w&#34;</span>, stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FREAD
</span><span style="color:#75715e"></span>    fread(fread_string, <span style="color:#ae81ff">1</span>, MAXS, stdin);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    init_memory();
    read(n);
    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> n; i<span style="color:#f92672">++</span>)
    {
        read(operator_num);
        read(special_num);
<span style="color:#75715e">#ifdef LOCAL_DEBUG
</span><span style="color:#75715e"></span>        printf(<span style="color:#e6db74">&#34;%d %dn&#34;</span>, operator_num, special_num);
<span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>        <span style="color:#66d9ef">if</span> (operator_num <span style="color:#f92672">==</span> OP_PET)
        {
            <span style="color:#66d9ef">if</span> (total_person <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>)
            {
                total_pet<span style="color:#f92672">++</span>;
                treap_insert(special_num);
            }
            <span style="color:#66d9ef">else</span>
            {
                total_person<span style="color:#f92672">--</span>;
                ans <span style="color:#f92672">+=</span> std<span style="color:#f92672">::</span>abs(treap_delete(special_num) <span style="color:#f92672">-</span> special_num);
                <span style="color:#66d9ef">if</span> (ans <span style="color:#f92672">&gt;=</span> MOD)
                {
                    ans <span style="color:#f92672">%=</span> MOD;
                }
            }
        }
        <span style="color:#66d9ef">else</span>
        {
            <span style="color:#66d9ef">if</span> (total_pet <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>)
            {
                total_person<span style="color:#f92672">++</span>;
                treap_insert(special_num);
            }
            <span style="color:#66d9ef">else</span>
            {
                total_pet<span style="color:#f92672">--</span>;
                ans <span style="color:#f92672">+=</span> std<span style="color:#f92672">::</span>abs(treap_delete(special_num) <span style="color:#f92672">-</span> special_num);
                <span style="color:#66d9ef">if</span> (ans <span style="color:#f92672">&gt;=</span> MOD)
                {
                    ans <span style="color:#f92672">%=</span> MOD;
                }
            }
        }
    }
    printf(<span style="color:#e6db74">&#34;%d&#34;</span>, ans);
<span style="color:#75715e">#ifdef LOCAL_TIME
</span><span style="color:#75715e"></span>    printf(<span style="color:#e6db74">&#34;nrun time: %lld msn&#34;</span>, clock() <span style="color:#f92672">-</span> start_time_);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#ifdef READ_FILE
</span><span style="color:#75715e"></span>    fclose(stdin);
<span style="color:#75715e">#ifndef STD_DEBUG
</span><span style="color:#75715e"></span>    fclose(stdout);
<span style="color:#75715e">#endif
</span><span style="color:#75715e">#endif
</span><span style="color:#75715e"></span>    <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
}
</code></pre></div>]]></content></item></channel></rss>