记录编号 153653 评测结果 AAAAAAAAAA
题目名称 [SPOJ 375] 难存的情缘 最终得分 100
用户昵称 Gravatar水中音 是否通过 通过
代码语言 C++ 运行时间 0.179 s
提交时间 2015-03-18 17:24:09 内存使用 1.50 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
using namespace std;
const int INF=1e9;
int i,n,p,zj1,zj2,zj3,ans;
int ROOT[10000]={0};
struct LINK{int fa,son,s,dep,w,z,ret,Root;}A[10010];
struct tree{int fa,ri,le,Max,L,R;}B[20010];
int C[10010]={0},Num,sj=1;
char str[10];

int to[20000]={0},ne[20000]={0},w[20000]={0},head[10000]={0},cor[20000]={0};
inline void addedge(int u,int v,int c)
{
	to[++sj]=v,ne[sj]=head[u],head[u]=sj,w[sj]=c;
	to[++sj]=u,ne[sj]=head[v],head[v]=sj,w[sj]=c;
}

inline void make_tree(int x,int l,int r)
{
	B[x].L=l,B[x].R=r;
	if(l==r){A[C[l]].ret=x,A[C[l]].z=l,B[x].Max=A[C[l]].w;return;}
	
	B[x].le=++Num,B[Num].fa=x;make_tree(Num,l,(l+r)>>1);
	B[x].ri=++Num,B[Num].fa=x;make_tree(Num,((l+r)>>1)+1,r);
	
	B[x].Max=max(B[B[x].le].Max,B[B[x].ri].Max);
}

inline void dfs_1(int x,int y)
{
	A[x].fa=y,A[x].s=1,A[x].dep=A[y].dep+1;
	for(int h=head[x];h;h=ne[h])if(to[h]!=y)
	{
		A[to[h]].w=w[h],cor[h>>1]=to[h];
		dfs_1(to[h],x);A[x].s+=A[to[h]].s;
		if(!A[x].son||(A[A[x].son].s<A[to[h]].s))A[x].son=to[h];
	}
}
inline void dfs_2(int x,int y)
{
	C[++C[0]]=x;A[x].Root=A[y].Root;
	if(x!=A[y].son)A[x].Root=x;
	if(A[x].son)dfs_2(A[x].son,x);else
	ROOT[A[x].Root]=++Num,make_tree(Num,1,C[0]),C[0]=0;
	for(int h=head[x];h;h=ne[h])
	if(to[h]!=y&&to[h]!=A[x].son)dfs_2(to[h],x);
}
void init()
{
	scanf("%d",&n);
	for(i=1;i<n;i++)
	{
		scanf("%d%d%d",&zj1,&zj2,&zj3);
		addedge(zj1,zj2,zj3);
	}
	dfs_1(1,1);dfs_2(1,1);
}

inline void Change(int x,int y)
{
	A[x].w=y;x=A[x].ret;B[x].Max=y;x=B[x].fa;
	while(x)
	B[x].Max=max(B[B[x].le].Max,B[B[x].ri].Max),x=B[x].fa;
}

inline void Findmax(int x,int ll,int rr)
{
	if(ll<=B[x].L&&rr>=B[x].R)
	{if(ans<B[x].Max)ans=B[x].Max;return;}
	
	int mid=(B[x].L+B[x].R)>>1;if(mid>=ll&&mid<rr)
	{Findmax(B[x].le,ll,mid);Findmax(B[x].ri,mid+1,rr);}
	else if(mid<ll)Findmax(B[x].ri,ll,rr);
	else Findmax(B[x].le,ll,rr);
}
 
inline void Query(int u,int v)
{
	ans=-INF;
	while(A[u].Root!=A[v].Root)
	{
		if(A[A[u].Root].dep<A[A[v].Root].dep)
		zj3=u,u=v,v=zj3;
		Findmax(ROOT[A[u].Root],1,A[u].z);
		u=A[u].Root,u=A[u].fa;
	}
	if(u!=v)
	{
		if(A[u].dep>A[v].dep)zj3=u,u=v,v=zj3;
		Findmax(ROOT[A[u].Root],A[A[u].son].z,A[v].z);
	}
	printf("%d\n",ans);
}

void work()
{
	while(1)
	{
		scanf("%s",str);
		if(str[0]=='C')
		{
			scanf("%d%d",&zj1,&zj2);
			Change(cor[zj1],zj2);
		}
		else if(str[0]=='Q')
		{
			scanf("%d%d",&zj1,&zj2);
			Query(zj1,zj2);
		}
		else break;
	}
}
int main()
{
	freopen("qtree.in","r",stdin);
	freopen("qtree.out","w",stdout);
	init();
	work();
	return 0;
}