rt,样例过了,然后 2h 没调出来
#include <bits/stdc++.h>
#define p2 (p << 1)
#define p3 (p << 1 | 1)
using namespace std;
const int maxn = 2e5 + 5;
struct edge{
int v, w, ord;
};
int n, m;
vector<edge> g[maxn];
int vop[maxn], ooe[maxn];
int fa[maxn], siz[maxn], dep[maxn], dfn[maxn], dfncnt;
int top[maxn], rnk[maxn], son[maxn];
void dfs(int);
void dfs(int, int);
void upd(int, int);
int qry(int, int, int);
struct segmentr{
int sum, maxx, minn, opr;
}tr[maxn << 2];
void build(int, int, int);
void modify_val(int, int, int, int, int);
void modify_opr(int, int, int, int, int);
int query(int, int, int, int, int, int);
void push_down(int);
void push_up(int);
void input();
void solve();
int main(){
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
input();
dep[1] = 1, dfs(1), dfs(1, 1);
build(1, n, 1);
while(m --) solve();
return 0;
}
void solve(){
string opr;
int x, y;
cin >> opr >> x >> y;
if(opr == "C") modify_val(1, n, dfn[ooe[x]], y, 1);
if(opr == "N") upd(x + 1, y + 1);
if(opr == "SUM") cout << qry(x + 1, y + 1, 1) << '\n';
if(opr == "MAX") cout << qry(x + 1, y + 1, 2) << '\n';
if(opr == "MIN") cout << qry(x + 1, y + 1, 3) << '\n';
return ;
}
void upd(int x, int y){
while(top[x] != top[y]){
if(dep[top[x]] < dep[top[y]]) swap(x, y);
modify_opr(1, n, dfn[top[x]], dfn[x], 1);
x = fa[top[x]];
}
if(dep[x] > dep[y]) swap(x, y);
modify_opr(1, n, dfn[x] + 1, dfn[y], 1);
return ;
}
int qry(int x, int y, int typ){
int res = (typ == 1? 0: (typ == 2? -1e3: 1e3));
while(top[x] != top[y]){
if(dep[top[x]] < dep[top[y]]) swap(x, y);
int t = query(1, n, dfn[top[x]], dfn[x], 1, typ);
res = (typ == 1? (res + t): (typ == 2? max(res, t): min(res, t)));
x = fa[top[x]];
}
if(dep[x] > dep[y]) swap(x, y);
int t = query(1, n, dfn[x] + 1, dfn[y], 1, typ);
res = (typ == 1? (res + t): (typ == 2? max(res, t): min(res, t)));
return res;
}
void build(int lf, int rt, int p){
if(lf == rt){
tr[p].sum = tr[p].maxx = tr[p].minn = vop[rnk[lf]];
tr[p].opr = 0;
return ;
}
int mid = lf + rt >> 1;
build(lf, mid, p2), build(mid + 1, rt, p3);
push_up(p);
return ;
}
void modify_val(int lf, int rt, int pos, int val, int p){
if(lf == rt && lf == pos){
tr[p].sum = tr[p].maxx = tr[p].minn = val;
tr[p].opr = 0;
return ;
}
push_down(p);
int mid = lf + rt >> 1;
if(pos <= mid) modify_val(lf, mid, pos, val, p2);
else modify_val(mid + 1, rt, pos, val, p3);
push_up(p);
return ;
}
void modify_opr(int lf, int rt, int s, int t, int p){
if(lf == s && rt == t){
tr[p].opr ^= 1;
tr[p].sum = -tr[p].sum, tr[p].maxx = -tr[p].maxx, tr[p].minn = -tr[p].minn;
swap(tr[p].maxx, tr[p].minn);
return ;
}
push_down(p);
int mid = lf + rt >> 1;
if(t <= mid) modify_opr(lf, mid, s, t, p2);
else if(mid < s) modify_opr(mid + 1, rt, s, t, p3);
else modify_opr(lf, mid, s, mid, p2), modify_opr(mid + 1, rt, mid + 1, t, p3);
push_up(p);
return ;
}
int query(int lf, int rt, int s, int t, int p, int typ){
if(lf == s && rt == t){
if(typ == 1) return tr[p].sum;
if(typ == 2) return tr[p].maxx;
return tr[p].minn;
}
push_down(p);
int mid = lf + rt >> 1;
if(t <= mid) return query(lf, mid, s, t, p2, typ);
else if(mid < s) return query(mid + 1, rt, s, t, p3, typ);
if(typ == 1) return query(lf, mid, s, mid, p2, typ) + query(mid + 1, rt, mid + 1, t, p3, typ);
if(typ == 2) return max(query(lf, mid, s, mid, p2, typ), query(mid + 1, rt, mid + 1, t, p3, typ));
return min(query(lf, mid, s, mid, p2, typ), query(mid + 1, rt, mid + 1, t, p3, typ));
}
void push_down(int p){
tr[p2].opr ^= tr[p].opr, tr[p3].opr ^= tr[p].opr;
if(tr[p].opr){
tr[p2].sum = -tr[p2].sum, tr[p2].maxx = -tr[p2].maxx, tr[p2].minn = -tr[p2].minn;
swap(tr[p2].maxx, tr[p2].minn);
tr[p3].sum = -tr[p3].sum, tr[p3].maxx = -tr[p3].maxx, tr[p3].minn = -tr[p3].minn;
swap(tr[p3].maxx, tr[p3].minn);
}
tr[p].opr = 0;
return ;
}
void push_up(int p){
tr[p].sum = tr[p2].sum + tr[p3].sum;
tr[p].maxx = max(tr[p2].maxx, tr[p3].maxx);
tr[p].minn = min(tr[p2].minn, tr[p3].minn);
return ;
}
void dfs(int u){
siz[u] = 1, son[u] = -1;
int len = g[u].size();
for(int i = 0; i < len; i ++){
int v = g[u][i].v, w = g[u][i].w, ord = g[u][i].ord;
if(dep[v]) continue;
vop[v] = w, ooe[ord] = v;
fa[v] = u, dep[v] = dep[u] + 1;
dfs(v);
siz[u] += siz[v];
if(son[u] == -1 || siz[v] > siz[son[u]]) son[u] = v;
}
return ;
}
void dfs(int u, int t){
top[u] = t, dfn[u] = (++ dfncnt), rnk[dfncnt] = u;
if(son[u] == -1) return ;
dfs(son[u], t);
int len = g[u].size();
for(int i = 0; i < len; i ++){
int v = g[u][i].v;
if(v == fa[u] || v == son[u]) continue;
dfs(v, v);
}
return ;
}
void input(){
cin >> n;
for(int i = 1; i < n; i ++){
int u, v, w;
cin >> u >> v >> w;
g[u + 1].push_back({v + 1, w, i});
g[v + 1].push_back({u + 1, w, i});
}
cin >> m;
return ;
}