题意
有 n n n个栈,编号为 1 1 1到 n n n,有以下三种操作:
1、对编号在 [ l , r ] [l,r] [l,r]中的每个栈执行 p u s h ( v ) push(v) push(v)操作。
2、对编号为 [ l , r ] [l,r] [l,r]中的每个栈执行 p o p ( ) pop() pop()操作。
3、查询某个栈中从栈顶开始第 k k k个元素。
n , q ≤ 2 ∗ 1 0 5 n,q\le2*10^5 n,q≤2∗105
分析
注意到对于某个询问,找到在它前面的最后一个 p u s h push push操作,满足执行该操作之后栈中恰好有 k k k个元素,则在该操作中入栈的元素就是答案。
考虑离线之后反着做,如果我们在遇到询问的时刻把询问加入,之后第一个时刻满足对应的栈中有 k k k个元素,就可以得到答案。
我们把询问按照栈的编号排序,用线段树维护询问序列,每次加入询问的时候把对应位置的值设为当前栈中元素数量减去询问的 k k k,把 p o p pop pop看成区间 + 1 +1 +1, p u s h push push看成区间 − 1 -1 −1,则每个有效位置的值在任意时刻都是非负的。若某个时刻一个位置的值变为