(我的码风可能比较毒瘤)
#include<cstdio>
#include<algorithm>
#define N 100005
#define M 300005
#define Q 30005
using namespace std;
int n, m, q, x, y, tott, totq, cnt, f[N << 1];
int fa[N<<1], ind[N<<1], vis[N<<1];
struct road {
int u, v, f;
bool operator < (const road &a)const {
return f > a.f;
}
} r[M];
struct tree {
int v, f;
tree *lson, *rson;
}*ht[N << 1], poolt[N << 2];
struct query {
int v, res;
query *next, *rev;
}*hq[N << 1], poolq[Q << 1];
void addedgeq(int u, int v) {
query *p = &poolq[++totq], *q = &poolq[++totq];
p->v = v;
p->next = hq[u];
hq[u] = p;
p->rev = q;
q->v = u;
q->next = hq[v];
hq[v] = q;
q->rev = p;
q->res = p->res = -1;
}
int find(int u) {
return f[u] == -1 ? u : f[u] = find(f[u]);
}
int find2(int u) {
return fa[u] == -1 ? u : fa[u] = find2(fa[u]);
}
void kruscal() {
sort(r + 1, r + m + 1);
cnt = n;
for (int i = 1; i <= 2 * n; i++) f[i] = -1;
for (int i = 1; i <= n; i++) ht[i] = &poolt[tott++], ht[i]->v = i;
for (int i = 1; i <= m; i++) {
int fu = find(r[i].u), fv = find(r[i].v);
if (fu != fv) {
ht[++cnt] = &poolt[tott++];
ht[cnt]->v = cnt;
ht[cnt]->f = r[i].f;
ht[cnt]->lson = ht[fu];
ht[cnt]->rson = ht[fv];
f[fu] = cnt;
f[fv] = cnt;
ind[fu]++;
ind[fv]++;
}
if (cnt == 2 * n - 1) return ;
}
}
void dfs(int u) {
fa[u] = -1;
vis[u] = 1;
if (u > n) {
dfs(ht[u]->rson->v),fa[ht[u]->rson->v] = u;
dfs(ht[u]->lson->v),fa[ht[u]->lson->v] = u;
}
else{
for (query *p = hq[u]; p; p = p->next) if (vis[p->v] && find(u) == find(p->v))
p->res = p->rev->res = ht[find2(p->v)]->f;
}
}
int main() {
scanf("%d%d", &n, &m);
scanf("%d", &q);
for (int i = 1; i <= m; i++) scanf("%d%d%d", &r[i].u, &r[i].v, &r[i].f);
for (int i = 1; i <= q; i++) {
scanf("%d%d", &x, &y);
addedgeq(x, y);
}
kruscal();
for (int i = 1; i <= 2 * n; i++) fa[i] = -1;
for (int i = n + 1; i <= cnt; i++) if (!ind[i]) dfs(i);
for (int i = 1; i <= 2 * q; i += 2) printf("%d\n", poolq[i].res);
return 0;
}