题目大意是,我们需要维护一个数列,支持对其进行修改和查询。
修改就是正常的单点修改,查询的话就有点不一样。
每一次查询的时候,我们会指定一个开始的位置和开始的方向。每一轮,我们向指定的方向找到第一个比当前位置高的地方,跳到那里,并将方向变为当前方向相反的那一个方向。
如果当前方向没有找到能够跳到的地方,那就停下。我们需要找到最后会停在哪里,并输出之。
题目保证每一时刻都没有两个高度是相同的。
我们设当前的这个位置为 p p p。
首先我们可以猜测,这个停下的位置一定会是起点左右的某一个最大值。
因为我们每一次查询的过程一定是在反复在起点的两侧跳跃。
为了分析方便,我们把这两个值的下标都取出来,分别称作 m a x l maxl maxl 和 m a x r maxr maxr。
然后我们开始分类讨论:
首先要考虑到的一种情况就是当前的位置已经是哪里都不能去了,即 a m a x l < a p a_{maxl} < a_p amaxl<ap 且 a m a x r < a p a_{maxr} < a_p amaxr<ap。
那就直接输出 p p p 就好了。
然后是两种次级情况。
一是左边没有比当前高的,但是右边有;二是右边没有比当前高的,但是左边有。
这两种情况的决策与开始时的方向有关,这里只拿第一种情况做例子。
如果开始时的方向是向左,那我们跳一次之后方向就会变成向右。
我们设这个位置是 m i n l minl minl。
因为有 a p > a m a x r a_p > a_{maxr} ap>amaxr,所以有 a m i n l > a m a x r a_{minl} > a_{maxr} aminl