Pagini recente » Cod sursa (job #1205795) | Cod sursa (job #3311020) | Cod sursa (job #487834) | Cod sursa (job #3340276) | Cod sursa (job #3352818)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
#pragma GCC target ("avx2")
#pragma GCC optimize ("O3")
#pragma GCC optimize ("unroll-loops")
using ll=long long;
const ll mod=998244353;
const int N=15001;
int n,k,m,rad[N*3];
ll mx[3*N],binlift[N*3][21];
int nodes,height[N];
vector<int>adj[N];
int get(int x)
{
int aux=x;
while(rad[aux]>0)
aux=rad[aux];
while(rad[x]>0)
{
int taux=rad[x];
rad[x]=aux;
x=taux;
}
return x;
}
void unite(int a,int b,ll scor)
{
nodes++;
rad[nodes]+=rad[a];
rad[nodes]+=rad[b];
rad[a]=nodes;
rad[b]=nodes;
adj[a].push_back(nodes);
adj[b].push_back(nodes);
adj[nodes].push_back(a);
adj[nodes].push_back(b);
mx[nodes]=scor;
}
void dfs(int nod,int p)
{
height[nod]=height[p]+1;
binlift[nod][0]=p;
for(int k=1;k<=14;k++)
{
binlift[nod][k]=binlift[binlift[nod][k-1]][k-1];
if(binlift[nod][k]==0)
break;
}
for(auto u:adj[nod])
{
if(u!=p)
dfs(u,nod);
}
}
int get_lca(int a,int b) {
if (height[a] > height[b])
swap(a, b);
for (int k = 14; k >= 0; k--) {
if (height[binlift[b][k]] >= height[a])
b = binlift[b][k];
}
if(a==b)
return a;
for(int k=14;k>=0;k--)
{
if(binlift[a][k]!=binlift[b][k])
{
a=binlift[a][k];
b=binlift[b][k];
}
}
return binlift[a][0];
}
struct trio
{
ll a,b,c;
bool operator<(const trio &other)const
{
return c<other.c;
}
};
void solve()
{
fin>>n>>m>>k;
nodes=n;
//fout<<n<<'\n';
for(int i=1;i<=n;i++)
rad[i]=-1;
vector<trio>muchii;
for(int i=1;i<=m;i++)
{
int a,b;
fin>>a>>b;
ll cost;
fin>>cost;
muchii.push_back({a,b,cost});
}
sort(muchii.begin(),muchii.end());
for(auto [x,y,k]:muchii)
{
int a=get(x);
int b=get(y);
//fout<<a<<" "<<b<<" "<<x<<" "<<y<<'\n';
if(a!=b)
unite(a,b,k);
}
//return;
dfs(nodes,0);
//fout<<k<<'\n';
for(int i=1;i<=k;i++)
{
int a,b;
fin>>a>>b;
int x=get_lca(a,b);
// fout<<x<<" "<<i<<'\n';
fout<<mx[x]<<'\n';
}
}
int main()
{
ios::sync_with_stdio(0);
fin.tie(0);
fout.tie(0);
int test=1;
if(!fin.is_open())
{
fout<<"hell";
return 0;
}
while(test--)
solve();
return 0;
}