rt,调了很久但毫无进展。
#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
#define debug() puts("-----")
using namespace std;
typedef pair<int,int> pii;
const int N=2e6+10;
int n;
int m,k;
int p[N];
int ans[N];
int val[N];
map<pii,bool> mp;
struct Edge{
int opt; int u,v,w; bool flg;
}e[N],q[N];
bool cmp(Edge a,Edge b){ return a.w<b.w; }
struct Node{
int w,tag;
int fa,ch[2];
}tr[N];
int get(int x){ return (x==tr[tr[x].fa].ch[1]); }
bool check(int x){ return (x!=tr[tr[x].fa].ch[0]&&x!=tr[tr[x].fa].ch[1]); }
void pushup(int u){
tr[u].w=max(val[u],max(tr[tr[u].ch[0]].w,tr[tr[u].ch[1]].w));
}
void pushdown(int u){
if(!tr[u].tag) return ;
swap(tr[tr[u].ch[0]].ch[0],tr[tr[u].ch[0]].ch[1]);
swap(tr[tr[u].ch[1]].ch[0],tr[tr[u].ch[1]].ch[1]);
tr[tr[u].ch[0]].tag^=1,tr[tr[u].ch[1]].tag^=1,tr[u].tag=0;
}
void update(int x){
if(!check(x)) update(tr[x].fa);
pushdown(x);
}
void rotate(int x){
int y=tr[x].fa,z=tr[y].fa,k=get(x);
if(!check(y)) tr[z].ch[get(y)]=x; tr[x].fa=z;
tr[y].ch[k]=tr[x].ch[k^1],tr[tr[x].ch[k^1]].fa=y;
tr[x].ch[k^1]=y,tr[y].fa=x; pushup(y);
}
void Splay(int x){
update(x);
while(!check(x)){
int y=tr[x].fa;
if(!check(y)){
if(get(x)^get(y)) rotate(x);
else rotate(y);
} rotate(x);
} pushup(x);
}
int access(int x){
int p=0;
while(x){
Splay(x);
tr[x].ch[1]=p;
pushup(x);
p=x,x=tr[x].fa;
} return p;
}
void makeRoot(int x){
access(x),Splay(x);
swap(tr[x].ch[0],tr[x].ch[1]); tr[x].tag^=1;
}
int Split(int x,int y){
makeRoot(x);
access(y);
Splay(y);
return y;
}
int find(int x){
access(x),Splay(x),pushdown(x);
while(tr[x].ch[0]) x=tr[x].ch[0],pushdown(x);
Splay(x); return x;
}
void link(int x,int y){
makeRoot(x);
if(find(y)!=x) tr[x].fa=y;
}
void cut(int x,int y){
Split(x,y);
if(tr[y].ch[0]==x&&!tr[y].ch[1]) tr[y].ch[0]=tr[x].fa=0,pushup(y);
}
int Find(int x,int w){
if(val[x]==w) return x;
if(tr[tr[x].ch[0]].w==w) return Find(tr[x].ch[0],w);
return Find(tr[x].ch[1],w);
}
int find_p(int x){
if(p[x]!=x) p[x]=find_p(p[x]);
return p[x];
}
void work(){
for(int i=1;i<=n;i++) p[i]=i;
for(int i=1;i<=m;i++) val[i+n]=e[i].w;
for(int i=1;i<=m;i++){
int u=e[i].u,v=e[i].v;
if(mp[{u,v}]) continue;
int pa=find_p(u),pb=find_p(v);
if(pa!=pb) p[pa]=pb,link(u,n+i),link(v,n+i);
}
}
signed main(){
scanf("%lld%lld%lld",&n,&m,&k);
for(int i=1;i<=m;i++){
scanf("%lld%lld%lld",&e[i].u,&e[i].v,&e[i].w);
if(e[i].u>e[i].v) swap(e[i].u,e[i].v);
} for(int i=1;i<=k;i++){
scanf("%lld%lld%lld",&q[i].opt,&q[i].u,&q[i].v);
if(q[i].u>q[i].v) swap(q[i].u,q[i].v);
if(q[i].opt==2) mp[{q[i].u,q[i].v}]=true;
} sort(e+1,e+m+1,cmp); work(); mp.clear();
for(int i=1;i<=m;i++) mp[{q[i].u,q[i].v}]=i;
for(int i=k;i>=1;i--){
int opt=q[i].opt,u=q[i].u,v=q[i].v,x=Split(u,v);
if(opt==1) ans[i]=tr[x].w;
else{
int id=Find(v,tr[x].w);
// cout<<"De "<<id<<endl;
// cout<<tr[x].w<<" "<<val[n+mp[{u,v}]]<<endl;
if(tr[x].w>val[n+mp[{u,v}]]){
cut(e[id-n].u,id);
cut(e[id-n].v,id);
// cout<<"De1 "<<e[id-n].u<<" "<<e[id-n].v<<" "<<id<<endl;
link(u,mp[{u,v}]+n);
link(v,mp[{u,v}]+n);
// cout<<"De2 "<<u<<" "<<v<<" "<<mp[{u,v}]+n<<endl;
}
}
} for(int i=1;i<=k;i++) if(q[i].opt==1) printf("%lld\n",ans[i]);
return 0;
}