单点修改
查询链上点权最大值
下面线段树的实现有很多冗余的东西,主要看两个dfs。
#include<bits/stdc++.h>
#define lson (o<<1)
#define rson (o<<1|1)
#define mid (l+r>>1)
#define ll long long
#define N 51000
using namespace std;
int i,n,m,h,t;
vector<int>nxt[N];
struct node{
ll data,lazy,len;
}tree[4*N];
int fa[N],deep[N],id[N],siz[N],son[N],tot,s[N],top[N];
void dfs(int u,int f) {
deep[u] = deep[f]+1; //深度
son[u] = 0; //重儿子
siz[u] = 1;
fa[u] = f; //父亲
for(auto v:nxt[u]) {
if(v==f)continue;
dfs(v,u);
siz[u] += siz[v];
if(siz[son[u]]<siz[v]) son[u] = v; //维护重儿子
}
}
void dfs2(int u,int t) {
id[u] = ++tot; //hash编号
top[u] = t;
if(son[u]) dfs2(son[u],t);
for(auto v:nxt[u]) {
if(v == fa[u]||v