题意
有n个栈,现在要资瓷以下操作:
1 l r询问编号在[l,r]之间的栈的栈顶的和
2 l对编号为l的栈进行一次pop操作
3 l r x对编号在[l,r]之间的栈进行一次push(x)操作
n,q≤500000 n , q ≤ 500000
分析
这题的extra test卡空间真的是丧心病狂,在卡空间的时候还出现了同一个程序有时可以跑有时会re的神奇情况,简直不能再爽。
这题的话,用一棵线段树来维护答案和每个位置当前的栈顶是什么时候push进来的,再用一棵可持久化线段树来维护每个操作后每个点往前第一个覆盖到它的操作是哪个。
询问就直接在答案线段树上询问,修改操作就分别在两棵线段树上改一下,就做完了。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
const int N=500005;
int n,m,ty,sz,rt[N],root,w[N],tot,u,v,z;
struct tree{
int l,r,s,tag;}t[N*140];