#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define fi first
#define se second
const int N=1e3+100,M=1e5+1e3+100;
#define gc getchar()
#define rd read()
inline int read(){
int x=0,f=0; char c=gc;
for(;c<'0'||c>'9';gc) f|=(c=='-');
for(;c>='0'&&c<='9';c=gc) x=(x<<1)+(x<<3)+(c^48);
return f?-x:x;
}
int n,m,q,edge[N][N],vis[M],_e_c=0,ans[M];
struct E{ int id,x,y,z; }e[M],_e[M];
struct QUE{ int op,x,y; }que[M];
inline bool cmpe(const E &x,const E &y){ return x.z<y.z; }
struct DSU{
int fa[N],siz[N];
inline void init(int n){ for(int i=1;i<=n;++i) fa[i]=i,siz[i]=1; }
inline int find(int x){ return fa[x]==x?x:fa[x]=find(fa[fa[x]]); }
inline int mer(int x,int y){ x=find(x),y=find(y); if(x==y) return 0; if(siz[x]<siz[y]) swap(x,y); siz[x]+=siz[y],fa[y]=x; return 1; }
}D;
#define lc(x) t[x].ch[0]
#define rc(x) t[x].ch[1]
#define fa(x) t[x].fa
struct TREE{ int ch[2],fa,v,rtag; pii mx; }t[M];
int sta[M],tp=0;
inline int get(int id){ return rc(fa(id))==id; }
inline int isrt(int id){ return lc(fa(id))!=id&&rc(fa(id))!=id; }
inline void pushup(int id){ t[id].mx=max({t[lc(id)].mx,t[rc(id)].mx,{t[id].v,id}}); }
inline void rev0(int id){ swap(lc(id),rc(id)),t[id].rtag^=1; }
inline void pushdown(int id){ if(t[id].rtag!=0) rev0(lc(id)),rev0(rc(id)),t[id].rtag=0; }
inline void rotate(int id){
int fa=fa(id),ffa=fa(fa),c=get(id);
if(!isrt(fa)) t[ffa].ch[get(fa)]=id;
t[fa].ch[c]=t[id].ch[c^1],fa(t[id].ch[c^1])=fa,t[id].ch[c^1]=fa;
fa(fa)=id,fa(id)=ffa,pushup(fa),pushup(id);
}
inline void updata(int id){ for(;!isrt(id);id=fa(id)) sta[++tp]=id; sta[++tp]=id; for(;tp;--tp) pushdown(sta[tp]); }
inline void splay(int id){ updata(id); for(;!isrt(id);rotate(id)) if(!isrt(fa(id))) rotate(get(fa(id))==get(id)?fa(id):id); }
inline void access(int id){ for(int las=0;id;id=fa(las=id)) splay(id),rc(id)=las,pushup(id); }
inline void mkrt(int id){ access(id);splay(id),rev0(id); }
inline void split(int x,int y){ mkrt(x),access(y),splay(y); }
inline void link(int x,int y){ mkrt(x),fa(x)=y; }
inline void cut(int x,int y){ split(x,y),fa(x)=lc(y)=0,pushup(y); }
int main(){
n=rd,m=rd,q=rd;
for(int i=1,x,y,z;i<=m;++i) x=rd,y=rd,z=rd,edge[x][y]=edge[y][x]=i,e[i]={i,x,y,z},t[i+n].v=z,pushup(i+n);
for(int i=1;i<=q;++i){ que[i]={rd,rd,rd}; if(que[i].op==2) vis[edge[que[i].x][que[i].y]]=1; }
for(int i=1;i<=m;++i) if(!vis[i]) _e[++_e_c]=e[i];
sort(_e+1,_e+_e_c+1,cmpe),D.init(n);
for(int i=1;i<=_e_c;++i) if(D.mer(_e[i].x,_e[i].y)) link(_e[i].x,_e[i].id+n),link(_e[i].id+n,_e[i].y);
memset(ans,-1,sizeof(ans));
for(int i=q,op,x,y,id,idc;i;--i){
op=que[i].op,x=que[i].x,y=que[i].y;
if(op==1) split(x,y),ans[i]=t[y].mx.fi;
else{
split(x,y);
id=edge[x][y],idc=t[y].mx.se-n;
if(e[idc].z>e[id].z) cut(e[idc].x,idc+n),cut(e[idc].y,idc+n),link(e[id].x,id+n),link(e[id].y,id+n);
}
}
for(int i=1;i<=q;++i) if(ans[i]!=-1) printf("%d\n", ans[i]);
return 0;
}
第一个测试点是
4 4 4
1 2 2
2 3 3
3 4 2
1 4 2
1 1 4
2 1 4
1 1 4
1 1 4
2
3
3
本地跑的飞快(毕竟很小)。