Pagini recente » Cod sursa (job #2484992) | Cod sursa (job #2707963) | Cod sursa (job #99112) | Cod sursa (job #854154) | Cod sursa (job #2167990)
#include <bits/stdc++.h>
using namespace std;
struct edge{
int a, b, c;
} M[30010];
int n, m, k, q, Euler[30010], lvl[30010], first[15010], Rmq[30010][16], p[15010], cost[15010];
bool u[15010];
vector <pair<int,int> > v[15010];
bool cmp(edge a, edge b){
return a.c < b.c;
}
int find(int i){
if (i == p[i]) return i;
p[i] = find(p[i]);
return p[i];
}
void dfs(int q, int lv){
u[q] = 1;
Euler[++k] = q;
first[q] = k;
lvl[k] = lv;
for (auto it: v[q]){
if (!u[it.first]){
p[it.first] = q;
cost[it.first] = it.second;
dfs(it.first, lv + 1);
Euler[++k] = q;
lvl[k] = lv;
}
}
}
int lca(int st, int dr){
int l = dr - st + 1, put = 0;
while ( (1<<(put + 1)) <= l) put++;
if (lvl[Rmq[st][put]] < lvl[Rmq[st + l - (1<<put)][put]]) return Euler[Rmq[st][put]];
else return Euler[Rmq[st + l - (1<<put)][put]];
}
int main(){
ifstream cin ("radiatie.in");
ofstream cout ("radiatie.out");
cin >> n >> m >> q;
for (int i=1; i<=m; i++){
int x, y, z;
cin >> x >> y >> z;
M[i] = {x, y, z};
}
sort(M+1, M+1+m, cmp);
for (int i=1; i<=n; i++) p[i] = i;
for (int i=1; i<=m && k < n - 1; i++){
int a = find(M[i].a), b = find(M[i].b);
if (a != b){
p[a] = b;
v[M[i].a].push_back({M[i].b, M[i].c});
v[M[i].b].push_back({M[i].a, M[i].c});
k++;
}
}
k = 0;
for (int i=1; i<=n; i++) p[i] = 0;
dfs(1, 1);
//preprocesare pt rmq
for (int i=1; i<=k; i++) Rmq[i][0] = i;
for (int j=1; (1<<j) <= n; j++){
for (int i=1; i + (1<<j) <= n; i++){
if (lvl[Rmq[i][j-1]] < lvl[Rmq[i + (1<<(j-1))][j-1]]) Rmq[i][j] = Rmq[i][j-1];
else Rmq[i][j] = Rmq[i + (1<<(j-1))][j-1];
}
}
for (int i=1; i<=q; i++){
int x, y, ans = 0;
cin >> x >> y;
if (first[x] > first[y]) swap(x, y);
int sf = lca(first[x], first[y]);
while (x != sf) ans = max(ans, cost[x]), x = p[x];
while (y != sf) ans = max(ans, cost[y]), y = p[y];
cout << ans << "\n";
}
return 0;
}