求求大佬们帮帮本蒟蒻吧
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
inline char nc () {
static char buf[1 << 21], *p1 = buf, *p2 = buf;
return p1 == p2 && (p2 = (p1 = buf) + fread (buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++;
}
inline int read () {
register int x(0),f(1);
char ch = getchar ();
while (ch > '9' || ch < '0') {if (ch == '-') f = ~f +1; ch = getchar ();}
while (ch <= '9' && ch >= '0') {x = (x << 3) + (x << 1) + (ch ^ 48); ch = getchar ();}
return x * f;
}
int n, m;
const int MAXN = 5000005;
struct node {
int to;
int next;
int val;
}e[MAXN << 1];
int head[MAXN << 1], cnt;
void add (int u, int v, int w) {
e[++cnt] = (node) {v, head[u], w};
head[u] = cnt;
}
int val[MAXN];
int dep[MAXN], siz[MAXN], fath[MAXN], son[MAXN];
void dfs_1 (int u, int fa) {
dep[u] = dep[fa] + 1;
siz[u] = 1;
fath[u] = fa;
int max_son = -1;
for (register int i(head[u]); i; i = e[i].next) {
int v = e[i].to;
if (v == fa) continue;
dfs_1 (v, u);
val[v] = e[i].val;
siz[u] += siz[v];
if (siz[v] > max_son) {
max_son = siz[v];
son[u] = v;
}
}
}
int top[MAXN], id[MAXN], awa[MAXN];
int tnt;
void dfs_2 (int u, int topf) {
top[u] = topf;
id[u] = ++tnt;
awa[tnt] = u;
if (!son[u]) return ;
dfs_2 (son[u], topf);
for (register int i(head[u]); i; i = e[i].next) {
int v = e[i].to;
if (v == fath[u] || v == son[u]) continue;
dfs_2 (v, v);
}
}
int laz[MAXN << 2], qmax[MAXN << 2], tag[MAXN << 2];
void push_up (int o) {
qmax[o] = max (qmax[o<<1], qmax[o<<1|1]);
}
void build (int o, int l, int r) {
tag[o] = -1;
if (l == r) {
qmax[o] = val[awa[l]];
return ;
}
int mid = (l + r) >> 1;
build (o<<1, l, mid);
build (o<<1|1, mid + 1, r);
push_up (o);
}
void pushdown (int o, int l, int r) {
if (laz[o]) {
laz[o<<1] += laz[o];
laz[o<<1|1] += laz[o];
qmax[o<<1] += laz[o];
qmax[o<<1|1] += laz[o];
laz[o] = 0;
}
if (tag[o] >= 0) {
laz[o<<1] = laz[o<<1|1] = 0;
qmax[o<<1] = qmax[o<<1|1] = tag[o<<1] = tag[o<<1|1] = tag[o];
tag[o] = -1;
}
}
int query (int o, int l, int r, int dl, int dr) {
if (dl <= l && r <= dr) {
return qmax[o];
}
int ans = -0x3f3f3f3f;
pushdown (o, l, r);
//printf ("%d %d %d %d %d\n", o, l, r, dl, dr);
int mid = (l + r) >> 1;
if (dl <= mid) ans = max (ans, query (o<<1, l, mid, dl, dr));
if (dr > mid) ans = max (ans, query (o<<1|1, mid +1, r, dl, dr));
push_up (o);
return ans;
}
void update (int o, int l, int r, int dl, int dr, int k) {
if (dl <= l && r <= dr) {
laz[o] += k;
qmax[o] += k;
return ;
}
int mid = (l + r) >> 1;
pushdown (o, l, r);
if (dl <= mid) update (o<<1, l, mid, dl, dr, k);
if (dr > mid) update (o<<1|1, mid +1, r, dl, dr, k);
push_up (o);
}
void updata (int o, int l, int r, int dl, int dr, int k) {
if (dl <= l && r <= dr) {
laz[o] = 0;
tag[o] = qmax[o] = k;
return ;
}
int mid = (l + r) >> 1;
pushdown (o, l, r);
if (dl <= mid) updata (o<<1, l, mid, dl, dr, k);
if (dr > mid) updata (o<<1|1, mid +1, r, dl, dr, k);
push_up (o);
}
void revise_cover (int x, int y, int z) {
while (top[x] != top[y]) {
if (dep[top[x]] < dep[top[y]]) swap (x, y);
updata (1, 1, n, id[top[x]], id[x], z);
x = fath[top[x]];
}
if (dep[x] > dep[y]) swap (x, y);
updata (1, 1, n, id[x] + 1, id[y], z);
return ;
}
void revise_add (int x, int y, int z) {
while (top[x] != top[y]) {
if (dep[top[x]] < dep[top[y]]) swap (x, y);
update (1, 1, n, id[top[x]], id[x], z);
x = fath[top[x]];
}
if (dep[x] > dep[y]) swap (x, y);
update (1, 1, n, id[x] + 1, id[y], z);
return ;
}
int access_max (int x, int y) {
int ans = -0x3f3f3f3f;
while (top[x] != top[y]) {
if (dep[top[x]] < dep[top[y]]) swap (x, y);
ans = max (ans, query (1, 1, n, id[top[x]], id[x]));
x = fath[top[x]];
}
if (dep[x] > dep[y]) swap (x, y);
ans = max (ans, query (1, 1, n, id[x] + 1, id[y]));
return ans;
}
int main () {
memset (laz, -1, sizeof(laz));
n = read ();
for (register int i(1); i < n; ++i) {
int u = read (), v = read (), w = read ();
add (u, v, w);
add (v, u, w);
}
dfs_1 (1, 0);
dfs_2 (1, 1);
val[1] = -0x3f3f3f3f;
build (1, 1, n);
char s[10];
while (1) {
scanf ("%s", s);
if (s[0] == 'S') break;
else if (s[1] == 'h') {
int k = read (), w = read ();
int tmp = id[son[k]];
if (tmp == 0) tmp = id[k];
updata (1, 1, n, tmp, tmp, w);
}
else if (s[1] == 'o') {
int u = read (), v = read (), w = read ();
revise_cover (u, v, w);
}
else if (s[1] == 'd') {
int u = read (), v = read (), w = read ();
revise_add (u, v, w);
}
else if (s[1] == 'a') {
int u = read (), v = read ();
printf ("%d\n", access_max (u, v));
}
}
return 0;
}