题目
这样今天的题单中就没有小于2KB的代码了呢。
AC Code:
#include<bits/stdc++.h>
#define maxn 45005
using namespace std;
int n,m,k;
int bl[maxn][2];
namespace LCT{
int fa[maxn],ch[maxn][2],Max[maxn],val[maxn],rev[maxn];
#define il inline
#define pa fa[x]
il int inr(int x){ return ch[pa][1]==x; }
il int isr(int x){ return ch[pa][1]!=x&&ch[pa][0]!=x; }
il void dt(int x){
if(rev[x]){
swap(ch[x][0],ch[x][1]),rev[x]=0;
if(ch[x][0]) rev[ch[x][0]]^=1;
if(ch[x][1]) rev[ch[x][1]]^=1;
}
}
il void dtpath(int x){ if(!isr(x)) dtpath(fa[x]); dt(x); }
il void upd(int x){
Max[x] = x;
if(val[Max[ch[x][0]]] > val[Max[x]]) Max[x] = Max[ch[x][0]];
if(val[Max[ch[x][1]]] > val[Max[x]]) Max[x] = Max[ch[x][1]];
}
il void rot(int x){
int y=fa[x],z=fa[y],c=inr(x);
if(!isr(y)) ch[z][inr(y)]=x;
(ch[y][c]=ch[x][!c])&&(fa[ch[y][c]]=y);
fa[fa[ch[x][!c]=y]=x]=z;
upd(y),upd(x);
}
il void splay(int x){
for(dtpath(x);!isr(x);rot(x))
if(!isr(pa)) rot(inr(pa)==inr(x)?pa:x);
}
il int access(int x,int y=0){
for(;x;x=fa[y=x]) splay(x),ch[x][1]=y,upd(x);
return y;
}
il void bert(int x){
access(x),splay(x),rev[x]^=1;
}
il int sert(int x){
access(x),splay(x);
for(;ch[x][0];x=ch[x][0]);
return x;
}
il void link(int x,int y){
bert(x),fa[x]=y;
}
il void cut(int x,int y){
bert(x),access(y),splay(y);
fa[x]=ch[y][0]=0;
upd(y);
}
il int query(int x,int y){
bert(x),access(y),splay(y);
return Max[y];
}
il void insert(int x,int y,int w){
if(sert(x)!=sert(y)){
val[++n]=w;
Max[n]=n;
link(bl[n][0]=x,n),link(n,bl[n][1]=y);
return;
}
int tmp = query(x,y);
if(val[tmp] > w){
cut(tmp,bl[tmp][0]),cut(tmp,bl[tmp][1]);
val[tmp] = w;
link(tmp,bl[tmp][0]=x),link(tmp,bl[tmp][1]=y);
}
}
}
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
LCT::insert(u,v,w);
}
for(;k--;){
int u,v;
scanf("%d%d",&u,&v);
printf("%d\n",LCT::val[LCT::query(u,v)]);
}
}