小K种妹妹
题号:NC20818
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 32 M,其他语言64 M
64bit IO Format: %lld

题目描述

众所周知,小K有一个可耐的骨科限定妹妹,所以小K很擅长打表,但是本题与打表无关

小K加入了某客组织,在这里他学会了种妹妹的方法,通过这种方式,小K可以获得更多的妹妹。

小K很希望可以获得更多的妹妹来关照,所以小K种下了一棵妹妹树,善于观察的他发现了每个妹妹都有一个可爱度……

由于小K的精力有限,他只能照顾可爱度大于某个值的妹妹。

他想知道某个子树中可爱度大于x的妹妹个数。

某个妹妹的可爱度可能发生变化……

树上可能会出现一只新的妹妹……

但是……树枝可能会断裂,于是,小K惊讶地发现,他的面前变成了一片妹妹树组成的森林……
初始你有一个有n个节点的有根妹妹树(根妹妹(节点)为1),妹妹(节点)编号为1-n,每个妹妹有一个可爱度,她有可能会变成森林。、
受某客组织神秘力量的影响,所以妹妹树支持以下几种操作:

0 u x 询问以u为根的子妹妹树中,可爱度严格大于x的妹妹的个数。

1 u x 把第u个妹妹的可爱度改成x。

2 u x 添加一个编号为"当前树中妹妹数+1"的妹妹,其父节点为u,其可爱度为x。

3 u 删除妹妹u与其父节点之间的路径。此时u的父节点变成叶子节点,u变成分裂出的树的根。


输入描述:

输入第一行包括一个正整数n(1<=n<=100000),代表树上的初始妹妹数。
接下来n-1行,每行2个整数u,v,为树上的一条无向边。
任何时刻,树上的任何妹妹的可爱度大于等于0,且两两不同。
接下来1行,包括n个整数wi,表示初始时每个妹妹的可爱度。
接下来1行,包括1个整数m(1<=m<=100000),表示操作总数。
接下来m行,每行最开始包括一个整数op,
若op=3,该行还会有一个整数u;
若op不等于3,该行还会有两个整数u,x;

输出描述:

对每个op=0,输出一行,包括一个整数,表示某个子树中可爱度大于x的妹妹个数。
示例1

输入

复制
2
1 2
10 20
1
0 1 5

输出

复制
2

备注:

op,u,x的数据范围不会超过int范围。
保证题目涉及的所有数在int内。