竟然进来了,就帮帮本蒟蒻吧,赏一关:
P1505
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,lso,top[200005],t=0,fa[200005],hs[200005],siz[200005],di[200005],a,b,c,d,in[200005],cnt,mod;
vector<int>vi[200005];
string s;
int ai[200005],bi[200005],r,sum[800005],maxx[800005],minn[800005],xi[200005],yi[200005],zi[200005];
bool neg[800005];
void pushdown(int rt,int l,int r){
if(neg[rt]){
sum[rt*2]=-sum[rt*2];
sum[rt*2+1]=-sum[rt*2+1];
int t1=maxx[rt*2],t2=maxx[rt*2+1];
maxx[rt*2]=-minn[rt*2];
maxx[rt*2+1]=-minn[rt*2];
minn[rt*2]=-t1;
minn[rt*2+1]=-t2;
neg[rt*2]=!neg[rt*2];
neg[rt*2+1]=!neg[rt*2+1];
neg[rt]=false;
}
}
void pushup(int rt){
maxx[rt]=max(maxx[rt*2],maxx[rt*2+1]);
minn[rt]=min(minn[rt*2],minn[rt*2+1]);
sum[rt]=sum[rt*2]+sum[rt*2+1];
}
void build(int l,int r,int rt){
if(l==r){
maxx[rt]=sum[rt]=minn[rt]=ai[l];
neg[rt]=false;
return;
}
int mid=(l+r)/2;
build(l,mid,rt*2);
build(mid+1,r,rt*2+1);
pushup(rt);
}
void update(int l,int r,int rt,int x,int y,int v){
if(x<=l&&y>=r){
sum[rt]=-sum[rt];
int t=maxx[rt];
maxx[rt]=-minn[rt];
minn[rt]=-t;
neg[rt]=!neg[rt];
return;
}
int mid=(l+r)/2;
pushdown(rt,mid-l+1,r-mid);
if(x<=mid){
update(l,mid,rt*2,x,y,v);
}
if(y>mid){
update(mid+1,r,rt*2+1,x,y,v);
}
pushup(rt);
}
void cover(int l,int r,int rt,int x,int y,int v){
if(x<=l&&y>=r){
maxx[rt]=minn[rt]=sum[rt]=v;
return;
}
int mid=(l+r)/2;
pushdown(rt,mid-l+1,r-mid);
if(x<=mid){
cover(l,mid,rt*2,x,y,v);
}
if(y>mid){
cover(mid+1,r,rt*2+1,x,y,v);
}
pushup(rt);
}
int querymx(int l,int r,int rt,int x,int y){
if(x<=l&&y>=r){
return maxx[rt];
}
int ans=-1e9,mid=(l+r)/2;
pushdown(rt,mid-l+1,r-mid);
if(x<=mid){
ans=max(ans,querymx(l,mid,rt*2,x,y));
}
if(y>mid){
ans=max(ans,querymx(mid+1,r,rt*2+1,x,y));
}
pushup(rt);
return ans;
}
int querymn(int l,int r,int rt,int x,int y){
if(x<=l&&y>=r){
return minn[rt];
}
int ans=1e9,mid=(l+r)/2;
pushdown(rt,mid-l+1,r-mid);
if(x<=mid){
ans=min(ans,querymn(l,mid,rt*2,x,y));
}
if(y>mid){
ans=min(ans,querymn(mid+1,r,rt*2+1,x,y));
}
pushup(rt);
return ans;
}
int querysm(int l,int r,int rt,int x,int y){
if(x<=l&&y>=r){
return sum[rt];
}
int ans=0,mid=(l+r)/2;
pushdown(rt,mid-l+1,r-mid);
if(x<=mid){
ans+=querysm(l,mid,rt*2,x,y);
}
if(y>mid){
ans+=querysm(mid+1,r,rt*2+1,x,y);
}
pushup(rt);
return ans;
}
void dfs1(int x,int fat){
fa[x]=fat;
siz[x]=1;
di[x]=di[fat]+1;
for(int i=0;i<vi[x].size();i++){
int v=vi[x][i];
if(v==fat){
continue;
}
dfs1(v,x);
if(!hs[x]||siz[v]>siz[hs[x]]){
hs[x]=v;
}
siz[x]+=siz[v];
}
}
void dfs2(int x,int t){
cnt++;
in[x]=cnt;
top[x]=t;
if(hs[x]){
dfs2(hs[x],t);
}
for(int i=0;i<vi[x].size();i++){
int v=vi[x][i];
if(v==fa[x]||v==hs[x]){
continue;
}
dfs2(v,v);
}
}
void uppath(int x,int y,int k){
while(top[x]!=top[y]){
if(di[top[x]]>=di[top[y]]){
update(1,n,1,in[top[x]],in[x],k);
x=fa[top[x]];
}
else{
update(1,n,1,in[top[y]],in[y],k);
y=fa[top[y]];
}
}
if(x==y){
return;
}
if(di[x]<di[y]){
update(1,n,1,in[hs[x]],in[y],k);
}
else{
update(1,n,1,in[hs[y]],in[x],k);
}
}
int smpath(int x,int y){
int ans=0;
while(top[x]!=top[y]){
if(di[top[x]]>=di[top[y]]){
ans+=querysm(1,n,1,in[top[x]],in[x]);
x=fa[top[x]];
}
else{
ans+=querysm(1,n,1,in[top[y]],in[y]);
y=fa[top[y]];
}
}
if(x==y){
return ans;
}
if(di[x]<di[y]){
ans+=querysm(1,n,1,in[hs[x]],in[y]);
}
else{
ans+=querysm(1,n,1,in[hs[y]],in[x]);
}
return ans;
}
int mnpath(int x,int y){
int ans=1e9;
while(top[x]!=top[y]){
if(di[top[x]]>=di[top[y]]){
ans=min(ans,querymn(1,n,1,in[top[x]],in[x]));
x=fa[top[x]];
}
else{
ans=min(ans,querymn(1,n,1,in[top[y]],in[y]));
y=fa[top[y]];
}
}
if(x==y){
return ans;
}
if(di[x]<di[y]){
ans=min(ans,querymn(1,n,1,in[hs[x]],in[y]));
}
else{
ans=min(ans,querymn(1,n,1,in[hs[y]],in[x]));
}
return ans;
}
int mxpath(int x,int y){
int ans=-1e9;
while(top[x]!=top[y]){
if(di[top[x]]>=di[top[y]]){
ans=max(ans,querymx(1,n,1,in[top[x]],in[x]));
x=fa[top[x]];
}
else{
ans=max(ans,querymx(1,n,1,in[top[y]],in[y]));
y=fa[top[y]];
}
}
if(x==y){
return ans;
}
if(di[x]<di[y]){
ans=max(ans,querymx(1,n,1,in[hs[x]],in[y]));
}
else{
ans=max(ans,querymx(1,n,1,in[hs[y]],in[x]));
}
return ans;
}
signed main(){
memset(minn,127,sizeof(minn));
memset(maxx,-127,sizeof(maxx));
cin>>n;
for(int i=1;i<n;i++){
cin>>xi[i]>>yi[i]>>zi[i];
vi[xi[i]].push_back(yi[i]);
vi[yi[i]].push_back(xi[i]);
}
dfs1(0,-1);
dfs2(0,0);
for(int i=1;i<n;i++){
if(di[xi[i]]>di[yi[i]]){
swap(xi[i],yi[i]);
}
ai[in[yi[i]]]=zi[i];
}
build(1,n,1);
cin>>m;
for(int i=1;i<=m;i++){
cin>>s;
if(s=="C"){
cin>>a>>b;
cover(1,n,1,in[yi[a]],in[yi[a]],b);
lso=i;
}
if(s=="N"){
cin>>a>>b;
if(a==b){
continue;
}
uppath(a,b,0);
lso=i;
}
if(s=="SUM"){
cin>>a>>b;
if(a==b){
cout<<0<<endl;
continue;
}
cout<<smpath(a,b)<<endl;
}
if(s=="MAX"){
cin>>a>>b;
if(a==b){
cout<<0<<endl;
continue;
}
cout<<mxpath(a,b)<<endl;
}
if(s=="MIN"){
cin>>a>>b;
if(a==b){
cout<<0<<endl;
continue;
}
cout<<mnpath(a,b)<<endl;
}
}
}