诸位不必看到较为复杂的代码就退出,程序样例过了 ,所以蒟蒻猜应该是个弱智的错误
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define debug cout<<-1<<endl
const int maxn=2e5+5;
const int inf=1001;
int n,m,uu,vv,ww;
string s;
int ii;
vector<int>q[maxn];
vector<int>val[maxn];
int fa[maxn],siz[maxn],dep[maxn],son[maxn],top[maxn];
int rnk[maxn],id[maxn];
int mi[4*maxn],ma[4*maxn],sum[4*maxn],a[maxn],tag[4*maxn];
inline int ls(int a){
return 2*a;
}
inline int rs(int a){
return 2*a+1;
}
inline void pushup(int a){
ma[a]=max(ma[ls(a)],ma[rs(a)]);
mi[a]=min(mi[ls(a)],mi[rs(a)]);
sum[a]=sum[ls(a)]+sum[rs(a)];
return;
}
void build(int l,int r,int p){
tag[p]=1;
if(l==r){
mi[p]=rnk[l];
ma[p]=rnk[l];
sum[p]=rnk[l];
return;
}
int mid=(l+r)/2;
build(l,mid,ls(p));
build(mid+1,r,rs(p));
pushup(p);
}
inline void f(int l,int r,int p,int k){
tag[p]*=k;// 1 -1
if(k==-1){
sum[p]=-1*sum[p];
int tem=ma[p];
ma[p]=-1*mi[p];
mi[p]=-1*tem;
}
return;
}
void pushdown(int l,int r,int p){
int mid=(l+r)/2;
f(l,mid,ls(p),tag[p]);
f(mid+1,r,rs(p),tag[p]);
tag[p]=0;
return ;
}
void change(int key,int l,int r,int p,int k){
if(l==r&&r==key){
tag[p]=1;
sum[p]=k;
ma[p]=k;
mi[p]=k;
return;
}
pushdown(l,r,p);
int mid=(l+r)/2;
if(mid>=key){
change(key,l,mid,ls(p),k);
}
if(mid<key){
change(key,mid+1,r,rs(p),k);
}
pushup(p);
return;
}
void turn(int nl,int nr,int l,int r,int p){
int ret=0;
if(nl<=l&&r<=nr){
f(l,r,p,-1);
return;
}
pushdown(l,r,p);
int mid=(l+r)/2;
if(mid>=nl){
turn(nl,nr,l,mid,ls(p));
}
if(mid<nr){
turn(nl,nr,mid+1,r,rs(p));
}
pushup(p);
return;
}
int query(int nl,int nr,int l,int r,int p){
int ret=0;
if(nl<=l&&r<=nr){
return sum[p];
}
pushdown(l,r,p);
int mid=(l+r)/2;
if(mid>=nl){
ret+=query(nl,nr,l,mid,ls(p));
}
if(mid<nr){
ret+=query(nl,nr,mid+1,r,rs(p));
}
return ret;
}
int askmax(int nl,int nr,int l,int r,int p){
int ret=-inf;
if(nl<=l&&r<=nr){
return ma[p];
}
pushdown(l,r,p);
int mid=(l+r)/2;
if(mid>=nl){
ret=max(ret,askmax(nl,nr,l,mid,ls(p)));
}
if(mid<nr){
ret=max(ret,askmax(nl,nr,mid+1,r,rs(p)));
}
return ret;
}
int askmin(int nl,int nr,int l,int r,int p){
int ret=inf;
if(nl<=l&&r<=nr){
return mi[p];
}
pushdown(l,r,p);
int mid=(l+r)/2;
if(mid>=nl){
ret=min(ret,askmin(nl,nr,l,mid,ls(p)));
}
if(mid<nr){
ret=min(ret,askmin(nl,nr,mid+1,r,rs(p)));
}
return ret;
}
void dfs1(int u,int last){
dep[u]=dep[fa[u]]+1;
siz[u]=1;
for(int i=0;i<q[u].size();i++){
int v=q[u][i];
if(v!=fa[u]){
fa[v]=u;
dfs1(v,u);
siz[u]+=siz[v];
if(siz[son[u]]<siz[v]){
son[u]=v;
}
}
}
}
int cnt=0;
void dfs2(int u,int tp){
top[u]=tp;
id[u]=++cnt;
rnk[cnt]=u;
if(son[u]){
dfs2(son[u],tp);
}
for(int i=0;i<q[u].size();i++){
int v=q[u][i];
if(v!=fa[u]&&v!=son[u]){
dfs2(v,v);
}
}
return;
}
void tur(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]>dep[top[y]]){
swap(x,y);
}
turn(id[top[y]],id[y],1,n,1);
y=fa[top[y]];
}
if(dep[x]>dep[y]){
swap(x,y);
}
if(id[x]+1<=id[y]){
turn(id[x]+1,id[y],1,n,1);
}
return;
}
int ask1(int x,int y){
int ret=0;
while(top[x]!=top[y]){
if(dep[top[x]]>dep[top[y]]){
swap(x,y);
}
ret+=query(id[top[y]],id[y],1,n,1);
y=fa[top[y]];
}
if(dep[x]>dep[y]){
swap(x,y);
}
if(id[x]+1<=id[y]){
ret+=query(id[x]+1,id[y],1,n,1);
}
return ret;
}
int ask2(int x,int y){
int ret=-inf;
while(top[x]!=top[y]){
if(dep[top[x]]>dep[top[y]]){
swap(x,y);
}
ret=max(ret,askmax(id[top[y]],id[y],1,n,1));
y=fa[top[y]];
}
if(dep[x]>dep[y]){
swap(x,y);
}
if(id[x]+1<=id[y]){
ret=max(ret,askmax(id[x]+1,id[y],1,n,1));
}
return ret;
}
int ask3(int x,int y){
int ret=inf;
while(top[x]!=top[y]){
if(dep[top[x]]>dep[top[y]]){
swap(x,y);
}
ret=min(ret,askmin(id[top[y]],id[y],1,n,1));
y=fa[top[y]];
}
if(dep[x]>dep[y]){
swap(x,y);
}
if(id[x]+1<=id[y]){
ret=min(ret,askmin(id[x]+1,id[y],1,n,1));
}
return ret;
}
signed main(){
scanf("%lld",&n);
for(int i=1;i<=n-1;i++){
scanf("%lld%lld%lld",&uu,&vv,&ww);
q[uu].push_back(vv);
val[uu].push_back(ww);
q[vv].push_back(uu);
val[vv].push_back(ww);
}
dfs1(1,0);
dfs2(1,1);
build(1,n,1);
scanf("%lld",&m);
while(m--){
cin>>s;
if(s[0]=='C'){
scanf("%lld%lld",&ii,&ww);
change(id[ii],1,n,1,ww);
}
else if(s[0]=='N'){
scanf("%lld%lld",&uu,&vv);
tur(uu,vv);
}
else if(s[0]=='S'){
scanf("%lld%lld",&uu,&vv);
printf("%lld\n",ask1(uu,vv));
}
else if(s[0]=='M'&&s[1]=='A'){
scanf("%lld%lld",&uu,&vv);
printf("%lld\n",ask2(uu,vv));
}
else{
scanf("%lld%lld",&uu,&vv);
printf("%lld\n",ask3(uu,vv));
}
}
return 0;
}