Pagini recente » Cod sursa (job #486573) | Cod sursa (job #1699552) | Cod sursa (job #477175) | Cod sursa (job #3239756) | Cod sursa (job #3308481)
#include <algorithm>
#include <iostream>
#include <fstream>
#include <climits>
#include <vector>
#include <stack>
#include <cmath>
// #include <bits/stdc++.h>
#define in fin
#define out fout
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
int f[15001];
int s[15001];
vector< pair<int, int> > g[15001];
int find_father(int x){
if( f[x] == x ) return x;
f[x] = find_father( f[x] );
return f[x];
}
void merge(int a, int b, int c){
int fa = find_father(a);
int fb = find_father(b);
if(fa == fb) return; // is deja merged :)
// mch.push_back( make_pair(a, b) );
g[a].push_back( make_pair(b, c) );
g[b].push_back( make_pair(a, c) );
if(s[a] > s[b]){
f[fb] = fa;
s[fa] += s[fb];
}else{
f[fa] = fb;
s[fb] += s[fa];
}
}
struct muchie{
int a, b, c;
bool operator<(const muchie &b) const {
return c < b.c;
}
};
int niv[15001];
int lca[15001][15];
int mx[15001][15];
void dfs(int nod, int f) {
for(const pair<int, int> &x : g[nod]){
if(x.first == f) continue;
niv[x.first] = niv[nod] + 1;
lca[x.first][0] = nod;
mx[x.first][0] = x.second;
for(int j = 1; j < 15; j++) {
lca[x.first][j] = lca[lca[x.first][j - 1]][j - 1];
mx[x.first][j] = max(mx[x.first][j - 1], mx[lca[x.first][j - 1]][j - 1]);
}
dfs(x.first, nod);
}
}
int query(int a, int b){
if(niv[b] > niv[a]) swap(a, b); // sa fie a cel mai jos
int sol = 0;
for(int i = 0; i < 15; i++){
if( (niv[a] - niv[b]) & (1 << i) ){
sol = max(sol, mx[a][i]);
a = lca[a][i];
}
}
for(int i = 14; i >= 0; i--){
if(lca[a][i] != lca[b][i]){
sol = max(sol, mx[a][i]);
sol = max(sol, mx[b][i]);
a = lca[a][i]; b = lca[b][i];
}
}
sol = max( max(lca[a][0], lca[b][0]), sol );
return sol;
}
signed main(){
ios_base::sync_with_stdio(false);
in.tie(NULL);
int n, m, q; in >> n >> m >> q;
muchie v[m];
for(int i = 0; i < m; i++) in >> v[i].a >> v[i].b >> v[i].c;
sort(v + 0, v + m);
for(int i = 0; i <= n; i++){ f[i] = i; s[i] = 1; }
for(int i = 0; i < m; i++) merge( v[i].a, v[i].b, v[i].c );
dfs(1, -1);
for(int i = 0; i < q; i++){
int a, b; in >> a >> b;
out << query(a, b) << '\n';
}
return 0;
}