题目 | WA 0pts
救救孩子吧
#include<bits/stdc++.h>
//#include<type_traits>
//#include<debug/debug.h>
//#include<bits/stl_pair.h>
//#pragma GCC optimize(1)
//#pragma GCC optimize(2)
//#ifndef _STL_ALGOBASE_H
//#if __cplusplus > 201703L
//#define _STL_ALGOBASE_H 1
//#if __cplusplus >= 201103L
//#include<bits/c++config.h>
//#include<ext/type_traits.h>
//#include<bits/functexcept.h>
//#include<bits/stl_iterator.h>
//#include<ext/numeric_traits.h>
//#include<bits/concept_check.h>
//#include<bits/predefined_ops.h>
//#include<bits/cpp_type_traits.h>
//#include<bits/move.h> // For std::swap
//#include<bits/stl_iterator_base_types.h>
//#include<bits/stl_iterator_base_funcs.h>
using namespace std;
//#define int long long
//#define ll long long int
//#define db double
//#define ld long double
#define ull unsigned long long
typedef long long ll;
//#define I using
//#define AK namespace
//#define IOI std
//I AK IOI;
#define ls k<<1,l,mid
#define rs k<<1|1,mid+1,r
int n,root=1,to[100005],w[100005],a[100005],size1[100005],dep1[100005],f[100005],son1[100005],seg[100005],top[100005],rev[100005],tot1,fr[100005];
vector<int>v[100005];
struct point{
int minn;
}tree[400005];
void pre(int k,int l,int r){
if(l==r){
tree[k].minn=a[rev[l]];
return ;
}
int mid=(l+r)>>1;
pre(ls);
pre(rs);
tree[k].minn=min(tree[k<<1].minn,tree[k<<1|1].minn);
return ;
}
void change1(int k,int l,int r,int x,int d){
if(l==r){
tree[k].minn=d;
return ;
}
int mid=(l+r)>>1;
if(x<=mid)
change1(ls,x,d);
else
change1(rs,x,d);
tree[k].minn=min(tree[k<<1].minn,tree[k<<1|1].minn);
return ;
}
int query(int k,int l,int r,int x,int y){
if(x<=l&&r<=y)
return tree[k].minn;
int mid=(l+r)>>1,res=0x3f3f3f3f;
if(x<=mid)
res=min(res,query(ls,x,y));
if(mid<y)
res=min(res,query(rs,x,y));
return res;
}
void dfs1(int x,int fa){
size1[x]=1;
dep1[x]=dep1[fa]+1;
for(int i=0;i<v[x].size();i++)
if(v[x][i]^fa){
f[v[x][i]]=x;
dfs1(v[x][i],x);
size1[x]+=size1[v[x][i]];
if(size1[v[x][i]]>size1[son1[x]])
son1[x]=v[x][i];
}
return ;
}
void dfs2(int x,int topf){
seg[x]=++tot1;
rev[tot1]=x;
top[x]=topf;
if(!son1[x])
return ;
dfs2(son1[x],topf);
for(int i=0;i<v[x].size();i++)
if(!top[v[x][i]]&&v[x][i]!=f[x])
dfs2(v[x][i],v[x][i]);
return ;
}
int ask1(int x,int y){
int ans=0x3f3f3f3f;
while(top[x]^top[y]){
if(dep1[top[x]]<dep1[top[y]])
swap(x,y);
ans=min(ans,query(1,1,n,seg[top[x]],seg[x]));
x=f[top[x]];
}
if(dep1[x]>dep1[y])
swap(x,y);
return min(ans,query(1,1,n,seg[x],seg[y]));
}
int main()
{
scanf("%d",&n);
for(int i=1,x,y;i<n;i++)
scanf("%d%d%d",&fr[i],&to[i],&w[i]),v[fr[i]].push_back(to[i]),v[to[i]].push_back(fr[i]);
dfs1(root,0);
dfs2(root,root);
a[root]=0x3f3f3f3f;
for(int i=1;i<n;i++)
if(dep1[fr[i]]>dep1[to[i]])
a[fr[i]]=w[i];
else
if(dep1[fr[i]]<dep1[to[i]])
a[to[i]]=w[i];
else
if(dep1[fr[i]]==dep1[to[i]])
return puts("WTF!"),0;
pre(1,1,tot1);
int x,y,z;
char op[10];
while("QnQ"){
scanf("%s",&op);
if(op[0]=='Q'){
scanf("%d%d",&x,&y);
if(x^y)
printf("%d\n",ask1(x,y));
else
puts("0");
}
else
if(op[0]=='C'){
scanf("%d%d",&x,&y);
if(dep1[fr[x]]>dep1[to[x]])
change1(1,1,n,seg[fr[x]],y);
else
if(dep1[fr[x]]<dep1[to[x]])
change1(1,1,n,seg[to[x]],y);
else
if(dep1[fr[x]]==dep1[to[x]])
return puts("WTF!"),0;
}
else
if(op[0]=='D')
break;
}
return 0;
}