rt。将 sz[i] += sz[j] 打成了 sz[i] += j 还对了。
code:
#include <bits/stdc++.h>
#define re register
using namespace std;
const int N = 1e5 + 10,M = 2e5 + 10;
int n,idx,num;
int h[N],ne[M],e[M],w[M],pre[M],nxt[M];
int f[N],d[N],sz[N],wson[N],arr[N],id[N],tp[N],val[N];
struct node{
int l;
int r;
int Max;
int add;
int upd;
}tr[N << 2];
inline int read(){
int r = 0,w = 1;
char c = getchar();
while (c < '0' || c > '9'){
if (c == '-') w = -1;
c = getchar();
}
while (c >= '0' && c <= '9'){
r = (r << 3) + (r << 1) + (c ^ 48);
c = getchar();
}
return r * w;
}
inline void add(int a,int b,int c){
ne[idx] = h[a];
pre[idx] = a;
nxt[idx] = e[idx] = b;
w[idx] = c;
h[a] = idx++;
}
inline void pushup(int u){
tr[u].Max = max(tr[u << 1].Max,tr[u << 1 | 1].Max);
}
inline void pushdown(int u){
if (~tr[u].upd){
tr[u << 1].Max = tr[u].upd;
tr[u << 1].upd = tr[u].upd;
tr[u << 1].add = 0;
tr[u << 1 | 1].Max = tr[u].upd;
tr[u << 1 | 1].upd = tr[u].upd;
tr[u << 1 | 1].add = 0;
tr[u].upd = -1;
}
if (tr[u].add){
tr[u << 1].Max += tr[u].add;
tr[u << 1].add += tr[u].add;
tr[u << 1 | 1].Max += tr[u].add;
tr[u << 1 | 1].add += tr[u].add;
tr[u].add = 0;
}
}
inline void build(int u,int l,int r){
tr[u] = {l,r,0,0,-1};
if (l == r){
tr[u].Max = val[l];
return;
}
int mid = l + r >> 1;
build(u << 1,l,mid);
build(u << 1 | 1,mid + 1,r);
pushup(u);
}
inline void modify_add(int u,int l,int r,int k){
if (l <= tr[u].l && tr[u].r <= r){
tr[u].Max += k;
tr[u].add += k;
return;
}
pushdown(u);
int mid = tr[u].l + tr[u].r >> 1;
if (l <= mid) modify_add(u << 1,l,r,k);
if (r > mid) modify_add(u << 1 | 1,l,r,k);
pushup(u);
}
inline void modify_upd(int u,int l,int r,int k){
if (l <= tr[u].l && tr[u].r <= r){
tr[u].Max = k;
tr[u].add = 0;
tr[u].upd = k;
return;
}
pushdown(u);
int mid = tr[u].l + tr[u].r >> 1;
if (l <= mid) modify_upd(u << 1,l,r,k);
if (r > mid) modify_upd(u << 1 | 1,l,r,k);
pushup(u);
}
inline int query(int u,int l,int r){
if (l <= tr[u].l && tr[u].r <= r) return tr[u].Max;
pushdown(u);
int res = 0;
int mid = tr[u].l + tr[u].r >> 1;
if (l <= mid) res = max(res,query(u << 1,l,r));
if (r > mid) res = max(res,query(u << 1 | 1,l,r));
return res;
}
inline void dfs1(int u,int fa){
sz[u] = 1;
f[u] = fa;
d[u] = d[fa] + 1;
for (re int i = h[u];~i;i = ne[i]){
int j = e[i];
if (j == fa) continue;
dfs1(j,u);
if (sz[j] > sz[wson[u]]) wson[u] = j;
sz[u] += j;
arr[j] = w[i];
}
}
inline void dfs2(int u,int fa,int top){
num++;
id[u] = num;
tp[u] = top;
val[num] = arr[u];
if (!wson[u]) return;
dfs2(wson[u],u,top);
for (re int i = h[u];~i;i = ne[i]){
int j = e[i];
if (j == fa || j == wson[u]) continue;
dfs2(j,u,j);
}
}
inline void modify_link_upd(int x,int y,int k){
while (tp[x] != tp[y]){
if (d[tp[x]] < d[tp[y]]) swap(x,y);
modify_upd(1,id[tp[x]],id[x],k);
x = f[tp[x]];
}
if (d[x] > d[y]) swap(x,y);
modify_upd(1,id[x] + 1,id[y],k);
}
inline void modify_link_add(int x,int y,int k){
while (tp[x] != tp[y]){
if (d[tp[x]] < d[tp[y]]) swap(x,y);
modify_add(1,id[tp[x]],id[x],k);
x = f[tp[x]];
}
if (d[x] > d[y]) swap(x,y);
modify_add(1,id[x] + 1,id[y],k);
}
inline int query_link(int x,int y){
int res = 0;
while (tp[x] != tp[y]){
if (d[tp[x]] < d[tp[y]]) swap(x,y);
res = max(res,query(1,id[tp[x]],id[x]));
x = f[tp[x]];
}
if (d[x] > d[y]) swap(x,y);
res = max(res,query(1,id[x] + 1,id[y]));
return res;
}
int main(){
// freopen("P4315_1.in","r",stdin);
// freopen("out.out","w",stdout);
memset(h,-1,sizeof(h));
n = read();
for (re int i = 1;i < n;i++){
int a,b,c;
a = read();
b = read();
c = read();
add(a,b,c);
add(b,a,c);
}
dfs1(1,-1);
dfs2(1,-1,1);
build(1,1,n);
while (1){
char op[10];
scanf("%s",op);
if (op[0] == 'S') break;
if (op[1] == 'h'){
int x,y;
x = (read() << 1) - 1;
y = read();
int u = pre[x];
int v = nxt[x];
modify_link_upd(u,v,y);
}
else if (op[1] == 'o'){
int x,y,z;
x = read();
y = read();
z = read();
modify_link_upd(x,y,z);
}
else if (op[0] == 'A'){
int x,y,z;
x = read();
y = read();
z = read();
modify_link_add(x,y,z);
}
else{
int x,y;
x = read();
y = read();
printf("%d\n",query_link(x,y));
}
}
// cout << endl << endl;
// for (re int i = 1;i <= 10;i++) cout << tr[i].Max << " ";
return 0;
}