Description
一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。
我们将以下面的形式来要求你对这棵树完成一些操作:
I. CHANGE u t : 把结点u的权值改为t
II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值
III. QSUM u v: 询问从点u到点v的路径上的节点的权值和
注意:从点u到点v的路径上的节点包括u和v本身
Analysis
本蒟蒻的第一道树剖。
不多说,裸题一道。
Key Code
int solve(int u,int v,bool bz)
{
int ans=bz?-N:0,x;
while(top[u]!=top[v])
{
if(dep[top[u]]>dep[top[v]]) swap(u,v);
x=top[v];
if(bz) ans=max(ans,find(1,1,m,w[x],w[v],bz));
else ans+=find(1,1,m,w[x],w[v],bz);
v=fa[x];
}
if(dep[u]>dep[v]) swap(u,v);
if(bz) ans=max(ans,find(1,1,m,w[u],w[v],bz));
else ans+=find(1,1,m,w[u],w[v],bz);
return ans;
}