记录编号 614521 评测结果 AAAAAAAAAA
题目名称 27.[WC 2006] 水管局长 最终得分 100
用户昵称 GravatarRpUtl 是否通过 通过
代码语言 C++ 运行时间 2.223 s
提交时间 2026-04-10 11:23:54 内存使用 11.09 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
struct LCT{
	int fa[N],s[N][2],rev[N];
	int val[N],mx[N],pos[N];
	void up(int x){
		mx[x]=max(max(mx[s[x][0]],mx[s[x][1]]),val[x]);
		if(mx[x]==val[x])pos[x]=x;
		if(mx[x]==mx[s[x][0]])pos[x]=pos[s[x][0]];
		if(mx[x]==mx[s[x][1]])pos[x]=pos[s[x][1]];
	}
	void mktg(int x){rev[x]^=1,swap(s[x][0],s[x][1]);}
	void down(int x){
		if(!rev[x])return;
		if(s[x][0])mktg(s[x][0]);
		if(s[x][1])mktg(s[x][1]);
		rev[x]=0;return;
	}
	bool chk(int x){return s[fa[x]][1]==x;}
	bool isrt(int x){return (s[fa[x]][0]!=x&&s[fa[x]][1]!=x);}
	void rotate(int x){
		int y=fa[x],z=fa[y],c=chk(x);
		if(!isrt(y))s[z][chk(y)]=x;
		fa[x]=z,s[y][c]=s[x][c^1];
		if(s[x][c^1])fa[s[x][c^1]]=y;
		fa[y]=x,s[x][c^1]=y;
		up(y),up(x);return;
	}
	void upd(int x){
		if(!isrt(x))upd(fa[x]);
		down(x);return;
	}
	void splay(int x){
		upd(x);
		for(int f=fa[x];!isrt(x);f=fa[x]){
			if(!isrt(f))rotate(chk(f)==chk(x)?f:x);
			rotate(x);
		}
	}
	void access(int x){
		for(int p=0;x;p=x,x=fa[x]){
			splay(x),s[x][1]=p,up(x);
		}
	}
	void mkrt(int x){access(x),splay(x),mktg(x);}
	void split(int x,int y){mkrt(x),access(y),splay(y);}
	void link(int x,int y){mkrt(x);fa[x]=y;}
	void cut(int x,int y){split(x,y),fa[x]=s[y][0]=0,up(y);}
	int query(int x,int y){split(x,y);return pos[y];}
	int findrt(int x){access(x);splay(x);while(s[x][0])x=s[x][0];return x;}
	bool check(int x,int y){mkrt(x);return (findrt(y)==x);}
}tr;
int n,m,q,u[N],v[N],w[N],o[N],x[N],y[N];
map<pair<int,int>,int>H;
void add(int i){
	if(!tr.check(u[i],v[i])){
		tr.link(u[i],n+i);
		tr.link(v[i],n+i);
	}else{
		int j=tr.query(u[i],v[i])-n;
		if(w[j]>w[i]){
			tr.cut(u[j],n+j);
			tr.cut(v[j],n+j);
			tr.link(u[i],n+i);
			tr.link(v[i],n+i);
		}
	}
	return;
}
int mk[N],ans[N];
int main(){
	freopen("tube.in","r",stdin);
	freopen("tube.out","w",stdout);
	scanf("%d %d %d",&n,&m,&q);
	for(int i=1;i<=m;i++){
		scanf("%d %d %d",u+i,v+i,w+i);
		if(u[i]>v[i])swap(u[i],v[i]);
		H[make_pair(u[i],v[i])]=i;
	}
	for(int i=1;i<=m;i++)tr.val[n+i]=w[i];
	for(int i=1;i<=q;i++){
		scanf("%d %d %d",o+i,x+i,y+i);
		if(x[i]>y[i])swap(x[i],y[i]);
		if(o[i]==2)mk[H[make_pair(x[i],y[i])]]=1;
	}
	for(int i=1;i<=m;i++)if(!mk[i])add(i);
	for(int i=q;i>=1;i--){
		if(o[i]==1)ans[i]=w[tr.query(x[i],y[i])-n];
		else add(H[make_pair(x[i],y[i])]);
	}
	for(int i=1;i<=q;i++){
		if(o[i]==1)printf("%d\n",ans[i]);
	}
	return 0;
}