调了一天了,讨论里的各种hack也都是对的,但是就是10pts
救救孩子qwq
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long n,head[4000010],tot,maxv[4000010],dis[1000010],mod[4000010],add[4000010],x[1000010],y[1000010],z[1000010];
long long father[1000010],seg[1000010],rev[1000010],size[1000010],dep[1000010],son[1000010],top[1000010];
struct node{
long long next,v,w;
}cnt[4000010];
void insert(long long u,long long v,long long w) {
cnt[++tot].next = head[u];
cnt[tot].v = v;
cnt[tot].w = w;
head[u] = tot;
}
void dfs1(long long u,long long fat) {
dep[u] = dep[fat] + 1;
size[u] = 1;
father[u] = fat;
for(long long i = head[u];i;i = cnt[i].next) {
if(cnt[i].v == fat) continue;
dis[cnt[i].v] = cnt[i].w;
dfs1(cnt[i].v,u);
size[u] += size[cnt[i].v];
if(size[cnt[i].v] > size[son[u]])
son[u] = cnt[i].v;
}
}
void dfs2(long long u,long long fat) {
if(son[u]) {
top[son[u]] = top[u];
seg[son[u]] = ++seg[0];
rev[seg[0]] = son[u];
dfs2(son[u],u);
}
for(long long i = head[u];i;i = cnt[i].next) {
if(!top[cnt[i].v]) {
top[cnt[i].v] = cnt[i].v;
seg[cnt[i].v] = ++seg[0];
rev[seg[0]] = cnt[i].v;
dfs2(cnt[i].v,u);
}
}
}
void build(long long k,long long l,long long r) {
if(l == r) {
maxv[k] = dis[rev[l]];
return;
}
long long mid = l+r>>1;
build(k*2,l,mid);
build(k*2+1,mid+1,r);
maxv[k] = max(maxv[k*2],maxv[k*2+1]);
}
void Mod(long long k,long long l,long long r,long long v) {
mod[k] = v;
maxv[k] = v;
}
void Add(long long k,long long l,long long r,long long v) {
add[k] += v;
maxv[k] += v;
}
void pushdown(long long k,long long l,long long r,long long mid) {
if(add[k] != 0) {
Add(k*2,l,mid,add[k]);
Add(k*2+1,mid+1,r,add[k]);
}
if(mod[k] != 0) {
Mod(k*2,l,mid,mod[k]);
Mod(k*2+1,mid+1,r,mod[k]);
mod[k] = 0;
}
add[k] = 0;
}
void modify1(long long k,long long l,long long r,long long x,long long y,long long v) {
if(l > y || r < x) return;
if(l >= x && r <= y) return Mod(k,l,r,v);
long long mid = (l+r)>>1;
pushdown(k,l,r,mid);
modify1(k*2,l,mid,x,y,v);
modify1(k*2+1,mid+1,r,x,y,v);
maxv[k] = max(maxv[k*2],maxv[k*2+1]);
}
void modify2(long long k,long long l,long long r,long long x,long long y,long long v) {
if(l > y || r < x) return;
if(l >= x && r <= y) return Add(k,l,r,v);
long long mid = (l+r)>>1;
pushdown(k,l,r,mid);
modify2(k*2,l,mid,x,y,v);
modify2(k*2+1,mid+1,r,x,y,v);
maxv[k] = max(maxv[k*2],maxv[k*2+1]);
}
long long query(long long k,long long l,long long r,long long x,long long y) {
if(l > y || r < x) return 0;
if(l >= x && r <= y) return maxv[k];
long long mid = (l+r)>>1;
pushdown(k,l,r,mid);
long long res = 0;
res = max(res,query(k*2,l,mid,x,y));
res = max(res,query(k*2+1,mid+1,r,x,y));
return res;
}
void change(long long k,long long l,long long r,long long x,long long v) {
if(l > r) return;
if(l > x || r < x) return;
if(l == r && l == x) {
maxv[k] = dis[rev[x]] = v;
return;
}
long long mid = l+r>>1;
change(k*2,l,mid,x,v);
change(k*2+1,mid+1,r,x,v);
maxv[k] = max(maxv[k*2],maxv[k*2+1]);
}
long long ask(long long x,long long y) {
long long res = 0;
long long fx = top[x],fy = top[y];
while(fx != fy) {
if(dep[fx] < dep[fy]) swap(x,y),swap(fx,fy);
res = max(res,query(1,1,seg[0],seg[fx],seg[x]));
x = father[fx];
fx = top[x];
}
if(dep[x] > dep[y]) swap(x,y);
res = max(res,query(1,1,seg[0],seg[x]+1,seg[y]));
return res;
}
void treemod(int x,int y,int flag,int v) {
int fx = top[x],fy = top[y];
while(fx != fy) {
if(dep[fx] < dep[fy]) swap(fx,fy),swap(x,y);
if(flag == 1) modify1(1,1,seg[0],seg[fx],seg[x],v);
else modify2(1,1,seg[0],seg[fx],seg[x],v);
x = father[fx];
fx = top[x];
}
if(dep[x] > dep[y]) swap(x,y);
if(flag == 1) modify1(1,1,seg[0],seg[x]+1,seg[y],v);
else modify2(1,1,seg[0],seg[x]+1,seg[y],v);
}
int main() {
cin >> n;
for(long long i = 1;i < n;i++) {
cin >> x[i] >> y[i] >> z[i];
insert(x[i],y[i],z[i]);
insert(y[i],x[i],z[i]);
}
dfs1(1,0);
top[1] = 1;
seg[1] = ++seg[0];
rev[seg[0]] = 1;
dfs2(1,0);
build(1,1,seg[0]);
string ins;
while(1) {
cin >> ins;
if(ins == "Stop") break;
long long l1,l2,l3;
if(ins == "Change") {
cin >> l1 >> l2;
if(dep[x[l1]] > dep[y[l1]]) {
change(1,1,seg[0],seg[x[l1]],l2);
}
else {
change(1,1,seg[0],seg[y[l1]],l2);
}
}
else if(ins == "Cover") {
cin >> l1 >> l2 >> l3;
treemod(l1,l2,1,l3);
}
else if(ins == "Add"){
cin >> l1 >> l2 >> l3;
treemod(l1,l2,2,l3);
}
else {
cin >> l1 >> l2;
cout << ask(l2,l1) << "\n";
}
}
return 0;
}