1 #include <cstdio>
2 #include <algorithm>
3 #include <cstring>
4 using namespace std;
5
6 const int maxn = 1e5+7;
7
8 int siz[maxn],dep[maxn],top[maxn],tid[maxn],ran[maxn],fa[maxn],son[maxn];
9 int tot ,kkk ,head[maxn];
10
11 struct node{
12 int to,next;
13 }EE[maxn*10];
14
15 void add_edge(int u,int v){
16 EE[kkk].to=v;EE[kkk].next=head[u];head[u]=kkk++;
17 }
18
19 void init(){
20 memset(head,-1,sizeof(head));
21 kkk = 0;
22 tot = 0;
23 }
24
25 void dfs1(int x,int u,int d){
26 siz[x] = 1;
27 son[x] = -1;
28 dep[x] = d;
29 fa[x] = u;
30 for(int i=head[x];i!=-1;i=EE[i].next){
31 int to = EE[i].to;
32 if(to != fa[x]){
33 dfs1(to,x,d+1);
34 siz[x] += siz[to];
35 if(son[x] == -1 || siz[to] > siz[son[x]])
36 son[x] = to;
37 }
38 }
39 }
40 void dfs2(int x,int u){
41 top[x] = u;
42 tid[x] = ++tot;
43 ran[tot] = x;
44 if(son[x] != -1) dfs2(son[x],u);
45 for(int i=head[x];i!=-1;i=EE[i].next){
46 int to = EE[i].to;
47 if(to != son[x] && to != fa[x])
48 dfs2(to,to);
49 }
50 }
51
52 void update(int x,int y){
53 while(top[x] != top[y]){
54 if(dep[top[x]] < dep[top[y]]) swap(x,y);
55 tre.update(1,tid[top[x]],tid[x]);
56 x = fa[top[x]];
57 }
58 if(dep[x] > dep[y]) swap(x,y);
59 if(x != y) tre.update(1,tid[son[x]],tid[y]);//给定边权值
60 ///tre.update(1,tid[x],tid[y]); //给节点权值
61 }
62
63 int query(int x,int y){
64 int sum = -1e9-7;
65 while(top[x] != top[y]){
66 if(dep[top[x]] < dep[top[y]]) swap(x,y);
67 sum = max(sum,tre.query(1,tid[top[x]],tid[x]));
68 x = fa[top[x]];
69 }
70 if(dep[x] > dep[y]) swap(x,y);
71 if(x != y) sum = max(sum,tre.query(1,tid[son[x]],tid[y]));//给边权值
72 ///sum = max(sum,tre.query(1,tid[x],tid[y]));//给节点权值
73 return sum;
74 }