题目链接
题意:有一棵N个点的树,每个点有对应的权值,现在有这样的操作,“0 a b”将a点的权值改成为b,“k a b”询问a到b的链上第k大的权值是几。
我们可以用dfs序的树上差分的方式来解决这个问题,可以发现,求u到v的信息,其实就是求u到lca和v到lca的合并,所以我们得想办法把这条链上的第k大给处理出来,这时候可以使用主席树来进行操作,我们不妨给点u赋值的时候,赋值给dfn[u]~dfn[u]+siz[u]-1,是这棵子树上的所有的点都被给予了这个值,不妨在dfn[u]位置“+1”,dfn[u]+siz[u]的位置上“-1”,用dfs序的方式将他们放到了一条链上去进行差分。
但是现在有了修改的操作,我们改变一个值的时候,实际上会对他的所有的子树造成影响,所以我们改成给原来的每个点都是一棵主席树,我们将原来的dfs序成的序列拿出来,看成一维轴的形式,然后,就是对这个一维的轴进行操作了。
那么,我们可以利用树状数组,对这个前缀差分来进行操作,不妨在dfn[u]的点处先减去原来的点权的贡献,再换上新的点权,然后同理不要忘记dfn[u]+siz[u]这个位置的操作。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include