TLE自动机 @ 2019-02-12 20:05:38
调了两个小时实在是调不动了,有大佬愿意帮一下吗Orz
#include<iostream>
#include<cstdio>
using namespace std;
const long long maxn=1e5+5;
long long read(){
long long x=0;char ch=getchar();bool pos=1;
for(;!isdigit(ch);ch=getchar()) if(ch=='-') pos=0;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
return pos?x:-x;
}
struct node{
long long v,next,u;
}edge[maxn];
long long head[maxn],tope,d[maxn],fa[maxn],dep[maxn],son[maxn],top[maxn],lnk[maxn],res[maxn],sz[maxn],cnt,wn[maxn],ans[maxn<<2];
void add(long long from,long long to){
edge[++tope].v=to;
edge[tope].next=head[from];
edge[tope].u=from;
head[from]=tope;
}
long long mmax(long long a,long long b){return a>b?a:b;}
void Mswap(long long &a,long long &b){a^=b,b^=a,a^=b;}
void dfs1(long long now,long long pre,long long de){
fa[now]=pre;
dep[now]=de;
long long maxn=-19260817;
for(long long i=head[now];i;i=edge[i].next){
long long v=edge[i].v;
if(v==pre) break;
dfs1(v,now,de+1);
sz[now]+=(sz[v]+1);
if(sz[v]>maxn){
maxn=sz[v];
son[now]=v;
}
}
}
void dfs2(long long now,long long tp){
lnk[now]=++cnt;
top[now]=tp;
if(!son[now]) return;
dfs2(son[now],tp);
for(long long i=head[now];i;i=edge[i].next){
long long v=edge[i].v;
if(v==fa[now]||v==son[now]) continue;
dfs2(v,v);
}
}
inline void push_up(long long now){
ans[now]=max(ans[now<<1],ans[now<<1|1]);
}
inline void work(long long l,long long r,long long now,long long end,long long k){
if(l==r){
ans[now]=k;
return;
}
ans[now]=mmax(ans[now],k);
long long mid=(l+r)/2;
if(end<=mid) work(l,mid,now<<1,end,k);
else work(mid+1,r,now<<1|1,end,k);
return;
}
inline void build(long long l,long long r,long long now){
if(l==r){
ans[now]=res[l];
return;
}
long long mid=(l+r)>>1;
build(l,mid,now<<1);
build(mid+1,r,now<<1|1);
push_up(now);
}
inline long long query(long long nl,long long nr,long long l,long long r,long long now){
long long re=-19260817;
if(nl>=l&&nr<=r) return ans[now];
long long mid=(nl+nr)>>1;
if(l<=mid) re=mmax(re,query(nl,mid,l,r,now<<1));
if(r>mid) re=mmax(re,query(mid+1,nr,l,r,now<<1|1));
return re;
}
inline long long ask(long long s1,long long s2){
long long re=-19260817;
while(top[s1]!=top[s2]){
if(dep[top[s1]]<dep[top[s2]]) Mswap(s1,s2);
re=mmax(re,query(1,cnt,lnk[top[s1]],lnk[s1],1));
s1=fa[top[s1]];
}
if(dep[s1]<dep[s2]) Mswap(s1,s2);
long long ed;
for(ed=s1;fa[ed]!=s2;ed=fa[ed]);//找到lca在当前重链上的儿子QwQ
re=mmax(re,query(1,cnt,lnk[ed],lnk[s1],1));
return re;
}
int main(){
long long n=read();
long long s;
for(long long i=2;i<=n;i++){
long long u,v,w;
u=read();v=read();w=read();
d[i-1]=w;
add(u,v);
add(v,u);
}string a;
dfs1(1,1,1);
dfs2(1,1);
for(long long i=1;i<=n-1;i++){
long long u=edge[i<<1].u;
long long v=edge[i<<1].v;
if(fa[u]=v) res[u]=d[i];
else res[v]=d[i];
}
build(1,n,1);
while(cin>>a){
if(a=="DONE") break;
long long x,y;
x=read();y=read();
if(a=="CHANGE"){
long long u=edge[x<<1].u;
long long v=edge[x<<1].v;
if(fa[u]=v) work(1,cnt,1,lnk[u],y);
else work(1,cnt,1,lnk[v],y);
}else{
printf("%lld\n",ask(x,y));
}
}
return 0;
}