记录编号 302642 评测结果 EEEEEEEEEE
题目名称 延绵的山峰 最终得分 0
用户昵称 Gravatar浮生随想 是否通过 未通过
代码语言 C++ 运行时间 1.380 s
提交时间 2016-09-04 15:20:21 内存使用 67.39 MiB
显示代码纯文本
#include<cstdlib>
#include<cstdio>
#include<iostream>
#include<cstring>
#define lch rt<<1,l,mid
#define rch rt<<1|1,mid+1,r
#define mid ((l+r)>>1)
using namespace std;
const int maxn=1000010;
struct edge{
	int to,next,dis,id;
}a[maxn<<1];
int len=0,head[maxn],b[maxn<<2],n,tem,size[maxn],son[maxn],fa[maxn],id[maxn],deep[maxn];
int top[maxn],pos[maxn],val[maxn],t[maxn],cnt=0;
void insert(int u,int v,int w,int h){
	len++;a[len].to=v;a[len].dis=w;a[len].next=head[u];a[len].id=h;head[u]=len;
}
void dfs1(int x){
	son[x]=0;size[x]=1;
	for(int i=head[x];i;i=a[i].next){
		int to=a[i].to;
		if(to!=fa[x]){
			val[to]=a[i].dis;
			t[a[i].id]=to;
			deep[to]=deep[x]+1;
			fa[to]=x;
			dfs1(to);
			size[x]+=size[to];
			if(size[to]>size[son[x]])son[x]=to;
		}
	}
}
void dfs2(int x,int t){
	top[x]=t;id[x]=++cnt;pos[cnt]=x;
	if(son[x]) dfs2(son[x],t);
	for(int i=head[x];i;i=a[i].next){
		int to=a[i].to;
		if(!top[to])	dfs2(to,to);
	}
}
void build(int rt,int l,int r){
	if(l==r){
		b[rt]=val[pos[l]];
		return;
	}
	build(lch);
	build(rch);
	b[rt]=max(b[rt<<1],b[rt<<1|1]);
}
int query(int s,int t,int rt,int l,int r){
	int ans=0;
	if(s<=l&&t>=r){
		return b[rt];
	}
	if(s<=mid) ans=max(ans,query(s,t,lch));
	if(t>mid) ans=max(ans,query(s,t,rch));
	return ans;
}
/*int query(int s,int t,int rt,int l,int r){
	if(s<=l&&t>=r){
		return b[rt];
	}
	if(s>mid)return query(s,t,rch);
	if(t<=mid)return query(s,t,lch);
	return max(query(s,t,lch),query(s,t,rch));
}*/
void change(int x,int y,int rt,int l,int r)
{
	if(l==r&&l==x){
		b[rt]=y;
		return;
	}
	if(x<=mid) change(x,y,lch);
	else change(x,y,rch);
	b[rt]=max(b[rt<<1],b[rt<<1|1]);
}
int anss(int x,int y){
	int ans=-0x7f7f7f7f;
	while(top[x]!=top[y]){
		if(deep[top[x]]<deep[top[y]]) swap(x,y);
		ans=max(ans,query(id[top[x]],id[x],1,1,n));
		x=fa[top[x]];
	}
	if(deep[x]>deep[y]) swap(x,y);
	ans=max(ans,query(id[son[x]],id[y],1,1,n));
	return ans;	
}
 
int main(){
	freopen("qtree.in","r",stdin);
	freopen("qtree.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<n;i++){
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		insert(x,y,z,i);
		insert(y,x,z,i);
	} 
	deep[1]=1;
	dfs1(1);
	dfs2(1,1);
	build(1,1,n);
	for(;;){
		string s;
		cin>>s;
		if(s[0]=='D')break;
		int x,y;
		scanf("%d%d",&x,&y);
		if(s[0]=='Q')
		printf("%d\n",anss(x,y));
		else
			change(id[t[x]],y,1,1,n);
	}
	//system("pause");
}