Pagini recente » Cod sursa (job #3263627) | Cod sursa (job #1955472) | Cod sursa (job #3249348) | Cod sursa (job #2958619) | Cod sursa (job #3005264)
#include <bits/stdc++.h>
#define int long long
using namespace std;
ifstream in("radiatie.in");
ofstream out("radiatie.out");
const int N = 30005;
const int LOG = 14;
int n, m, q;
int sef[N], nivel[N];
struct k
{
int x, y, z;
};
k v[N];
int sz[N];
int cmp(k a, k b)
{
return a.z < b.z;
}
vector <pair <int, int>> g[N];
int find(int nod)
{
if(nod == sef[nod])
return nod;
return find(sef[nod]);
}
int up[N][LOG], maxi[N][LOG];
void dfs(int nod)
{
for(auto it:g[nod])
{
nivel[it.first] = nivel[nod] + 1;
up[it.first][0] = nod;
maxi[it.first][0] = it.second;
dfs(it.first);
}
}
int lca(int a, int b)
{
if(nivel[a] > nivel[b])
swap(a, b);
int diff = nivel[b] - nivel[a], ans = 0;
for(int i = 0; i < LOG; i++)
{
if(diff & (1 << i))
{
ans = max(ans, maxi[b][i]);
b = up[b][i];
}
}
if(a == b)
return ans;
for(int i = LOG - 1; i >= 0; i--)
{
if(up[a][i] != up[b][i])
{
ans = max(ans, max(maxi[a][i], maxi[b][i]));
a = up[a][i];
b = up[b][i];
}
}
ans = max(ans, max(maxi[a][0], maxi[b][0]));
return ans;
}
signed main()
{
in >> n >> m >> q;
for(int i = 1; i <= m; i++)
{
in >> v[i].x >> v[i].y>> v[i].z;
}
sort(v + 1, v + m + 1, cmp);
for(int i = 1; i <= n; i++)
{
sef[i] = i;
sz[i] = 1;
}
for(int i = 1; i <= m; i++)
{
int a = find(v[i].x), b = find(v[i].y);
if(a != b)
{
if(sz[a] < sz[b])
{
sef[a] = b;
sz[b] += sz[a];
g[b].push_back({a, v[i].z});
}
else
{
sef[b] = a;
sz[a] += sz[b];
g[a].push_back({b, v[i].z});
}
}
}
for(int i = 1; i <= n; i++)
{
if(sef[i] == i)
dfs(i);
}
for(int i = 1; 1 << i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
up[j][i] = up[up[i - 1][j]][i - 1];
}
}
for(int i = 1; 1 << i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
maxi[j][i] = max(maxi[j][i - 1], maxi[up[i - 1][j]][i - 1]);
}
}
while(q--)
{
int x, y;
in >> x >> y;
out << lca(x, y) << '\n';
}
return 0;
}