经过今日的一些修改,昨天的RE已经消失,但只有8分
#include<bits/stdc++.h>
#define inf (int)(2e9 + 4)
#define _ (int)(2e5 + 4)
using namespace std;
int n, m;
int o, hd[_];
struct ed {
int v, w, ne;
} e[_ << 2];
struct info {
int mx, mn, sum, tg;
} tree[_ << 2];
int c, d[_], siz[_], hson[_], fa[_], top[_], dfn[_], rk[_], val[_];
void add(int u, int v, int w) {
e[++o] = {v, w, hd[u]};
hd[u] = o;
}
namespace Seg {
#define L (fa << 1)
#define R (fa << 1 | 1)
#define mid (l + r >> 1)
auto merge(info l, info r) {
return (info) {
max(l.mx, r.mx),
min(l.mn, r.mn),
l.sum + r.sum, 0
};
}
auto cover(int p) {
return (info) {
-tree[p].mn,
-tree[p].mx,
-tree[p].sum,
!tree[p].tg
};
}
void build(int fa, int l, int r) {
if(l == r) {
int tp = val[rk[l]];
tree[fa] = {tp, tp, tp, 0};
return ;
}
build(L, l, mid), build(R, mid + 1, r);
tree[fa] = merge(tree[L], tree[R]);
}
void push_down(int fa) {
if(!tree[fa].tg) return ;
cover(L), cover(R);
tree[fa].tg = 0;
}
void update(int fa, int l, int r, int ql, int qr, int w, bool f) {
if(ql > qr) return ;
if(ql <= l && r <= qr) {
if(!f) tree[fa] = {w, w, w, 0};
else tree[fa] = cover(fa);
return ;
}
push_down(fa);
if(ql <= mid) update(L, l, mid, ql, qr, w, f);
if(qr > mid) update(R, mid + 1, r, ql, qr, w, f);
tree[fa] = merge(tree[L], tree[R]);
}
auto query(int fa, int l, int r, int ql, int qr) {
if(ql > qr) return (info) {-inf, inf, 0, 0};
if(ql <= l && r <= qr) return tree[fa];
push_down(fa);
if(qr <= mid) return query(L, l, mid, ql, qr);
else if(ql > mid) return query(R, mid + 1, r, ql, qr);
else {
info lson = query(L, l, mid, ql, qr), rson = query(R, mid + 1, r, ql, qr);
return merge(lson, rson);
}
}
}
namespace Cut {
void dfs1(int u) {
siz[u] = 1, hson[u] = 0;
for(int i = hd[u]; i; i = e[i].ne) {
int v = e[i].v, w = e[i].w;
if(v == fa[u]) continue;
fa[v] = u, d[v] = d[u] + 1, val[v] = w;
dfs1(v);
siz[u] += siz[v];
if(siz[v] > siz[hson[u]]) hson[u] = v;
}
}
void dfs2(int u, int tp) {
dfn[u] = ++c, rk[c] = u, top[u] = tp;
if(hson[u]) dfs2(hson[u], tp);
for(int i = hd[u]; i; i = e[i].ne) {
int v = e[i].v;
if(v == fa[u] || v == hson[u]) continue;
dfs2(v, v);
}
}
void tree_up(int u, int v) {
while(top[u] != top[v]) {
if(d[top[u]] < d[top[v]]) swap(u, v);
Seg :: update(1, 1, n, dfn[top[u]], dfn[u], 0, 1);
u = fa[top[u]];
}
if(d[u] < d[v]) swap(u, v);
if(u != v) {
Seg :: update(1, 1, n, dfn[v] + 1, dfn[u], 0, 1);
}
}
auto tree_q(int u, int v) {
info r, tp;
r = {-inf, inf, 0, 0};
while(top[u] != top[v]) {
if(d[top[u]] < d[top[v]]) swap(u, v);
tp = Seg :: query(1, 1, n, dfn[top[u]], dfn[u]);
r = Seg :: merge(tp, r);
u = fa[top[u]];
}
if(d[u] < d[v]) swap(u, v);
if(u != v) {
tp = Seg :: query(1, 1, n, dfn[v] + 1, dfn[u]);
r = Seg :: merge(tp, r);
}
return r;
}
}
int main() {
cin >> n;
for(int i = 1; i < n; i ++) {
int u, v, w;
cin >> u >> v >> w;
u ++, v ++;
add(u, v, w), add(v, u, w);
}
Cut :: dfs1(1), Cut :: dfs2(1, 1);
Seg :: build(1, 1, n);
cin >> m;
for(int i = 1; i <= m; i ++) {
string opt;
int x, y;
cin >> opt >> x >> y;
if(opt == "C") {
int a = e[2 * x - 1].v, b = e[2 * x].v;
int p = (d[a] > d[b] ? a : b);
Seg :: update(1, 1, n, dfn[p], dfn[p], y, 0);
} else {
x ++, y ++;
if(opt == "N") Cut :: tree_up(x, y);
else {
info ans = Cut :: tree_q(x, y);
if(opt == "SUM") cout << ans.sum << endl;
else if(opt == "MAX") cout << ans.mx << endl;
else cout << ans.mn << endl;
}
}
}
return 0;
}