题目大意
有一棵\(n\)个点有点权\(w\)(可能有重复)的二叉树。\(m\)次操作,操作种类如下:
1.给出点\(x\),修改\(x\)的权值;
2.给出点\(x\),交换它和它的子树内所有点的左右儿子;
3.给出点\(x\),问从根出发是否可以用“当前点点权小于\(w_x\)就往右走,大于\(w_x\)就往左走,等于\(w_x\)就停”来走到点\(x\)。
\(n,m\leq 10^5;\)
题解
当且仅当根到\(x\)路径上所有点满足“\(x\)在这个点左子树时点权大于\(w_x\),在右子树时点权小于\(x\)”时操作3的答案是“是”。
相当于前一类点的最小值大于\(x\),后一类点的最大值大于\(x\)。可以用两棵线段树维护。
操作2相当于两个线段树上的一些点。
代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
一些感想
为啥我打不过人???