RT,帮我看看吧。
#include<bits/stdc++.h>
#define int long long
#define ls tr[x].s[0]
#define rs tr[x].s[1]
using namespace std;
const int N=2e5+5,inf=2e9;
int n,m,q,st[N],id;
map<pair<int,int>,int>mp;
struct Splay{
int fa,s[2];
int sz,id,w;
bool fr;
}tr[N];
struct edge{
int u,v,w,id;
}egs[N];
struct qry{
int op,u,v,w;
}ans[N];
inline bool nroot(int x){return tr[tr[x].fa].s[0]==x||tr[tr[x].fa].s[1]==x;}
inline void chgr(int x){if(x)swap(ls,rs),tr[x].fr^=1;}
inline void pushdown(int x){if(tr[x].fr)chgr(ls),chgr(rs),tr[x].fr=0;}
inline void pushup(int x){
tr[x].sz=tr[ls].sz+tr[rs].sz+1,tr[x].id=0;
if(tr[tr[x].id].w<tr[x].w)tr[x].id=x;
if(tr[tr[x].id].w<tr[tr[ls].id].w)tr[x].id=tr[ls].id;
if(tr[tr[x].id].w<tr[tr[rs].id].w)tr[x].id=tr[rs].id;
}
inline void rotate(int x){
int y=tr[x].fa,z=tr[y].fa,t;
bool xy=(tr[y].s[1]==x),yz=(tr[z].s[1]==y);
if(nroot(y))tr[z].s[yz]=x;tr[x].fa=z;
t=tr[y].s[xy]=tr[x].s[!xy];if(t)tr[t].fa=y;
tr[x].s[!xy]=y,tr[y].fa=x;pushup(y);
}
inline void splay(int x){
int y=x,z=0;st[++z]=y;
while(nroot(y))st[++z]=y=tr[y].fa;
while(z)pushdown(st[z--]);
while(nroot(x)){
y=tr[x].fa,z=tr[y].fa;
if(nroot(y))rotate((tr[y].s[1]==x^tr[z].s[1]==y)?x:y);
rotate(x);
}pushup(x);
}
inline void access(int x){for(int y=0;x;x=tr[y=x].fa)splay(x),rs=y,pushup(x);}
inline void makeroot(int x){access(x),splay(x),chgr(x);}
inline void split(int x,int y){makeroot(x),access(y),splay(y);}
inline int findroot(int x){access(x),splay(x);while(ls)pushdown(x=ls);splay(x);return x;}
inline void link(int x,int y){makeroot(x);if(findroot(y)!=x)tr[x].fa=y;}
inline bool cmp(edge x,edge y){return x.id>y.id;}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m>>q,id=n;
int op,u,v,w,j=q;
for(int i=1; i<=m; ++i)
cin>>u>>v>>w,egs[i]={u,v,w,inf},mp[{u,v}]=i;
for(int i=1; i<=q; ++i){
cin>>op>>u>>v;
ans[i]=(qry){op,u,v,0};
if(op==2)egs[mp[{u,v}]].id=i;
}
sort(egs+1,egs+1+m,cmp);
for(int i=1,x; i<=m; ++i){
for(; j>egs[i].id; --j)
if(ans[j].op==1){
u=ans[j].u,v=ans[j].v;
split(u,v),ans[j].w=tr[tr[v].id].w;
}
u=egs[i].u,v=egs[i].v,w=egs[i].w;
if(findroot(u)==findroot(v)){
split(u,v),x=tr[v].id;
if(tr[x].w<=w)continue;
splay(x),tr[ls].fa=tr[rs].fa=0;
}
link(u,++id),link(v,id),splay(id);
tr[id].w=w,tr[id].id=id;
}
while(--j)
if(ans[j].op==1){
u=ans[j].u,v=ans[j].v;
split(u,v),ans[j].w=tr[tr[v].id].w;
}
for(int i=1; i<=q; ++i)
if(ans[i].op==1)cout<<ans[i].w<<'\n';
return 0;
}