Pagini recente » Cod sursa (job #854124) | Cod sursa (job #813320) | Cod sursa (job #1949833) | Cod sursa (job #1758341) | Cod sursa (job #2943930)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
///#include <tryhardmode>
///#include <GODMODE::ON>
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
struct elem
{
int x;
int y;
int c;
};
bool cmp(elem a, elem b)
{
return a.c<b.c;
}
const int NMAX=15e3+5;
const int INF=1e9;
int te[NMAX];
int lvl[NMAX];
int t[20][NMAX];
int rmq[20][NMAX];
int n;
vector<pair <int, int>>v[NMAX];
vector<elem> apm;
int root(int x)
{
if(te[x]==x)
return x;
return te[x]=root(te[x]);
}
void solve(int x,int y)
{
te[root(x)]=root(y);
}
void dfs(int p, int tata)
{
lvl[p]=lvl[tata]+1;
rmq[0][p]=tata;
for(auto i:v[p])
if(i.first!=tata)
{
t[0][i.first]=i.second;
dfs(i.first,p);
}
}
void RMQ()
{
int e,i;
for(e=1;(1<<e)<=n;e++)
for(i=1;i<=n;i++)
{
rmq[e][i]=rmq[e-1][rmq[e-1][i]];
t[e][i]=max(t[e-1][i],t[e-1][rmq[e-1][i]]);
}
}
int lca(int x,int y)
{
int level,kon,e;
kon=-INF;
if(lvl[x]<lvl[y])
swap(x,y);
level=lvl[x]-lvl[y];
for(e=15;e>=0;e--)
if(level & (1<<e))
x=rmq[e][x];
if(x==y)
return x;
for(e=15;e>=0;e--)
if(rmq[e][x]!=rmq[e][y])
x=rmq[e][x],y=rmq[e][y];
return rmq[0][x];
}
int query(int p,int level)
{
int kon=0,e;
for(e=15;e>=0;e--)
if(level & (1<<e))
{
kon=max(kon,t[e][p]);
p=rmq[e][p];
}
return kon;
}
int main()
{
int m,q,i,j,x,y,c,lac,kon;
fin>>n>>m>>q;
for(i=1;i<=n;i++)
te[i]=i;
for(i=1;i<=m;i++)
{
fin>>x>>y>>c;
apm.push_back({x,y,c});
}
sort(apm.begin(),apm.end(),cmp);
for(auto i:apm)
if(root(i.x)!=root(i.y))
{
v[i.x].push_back({i.y,i.c});
v[i.y].push_back({i.x,i.c});
solve(i.x,i.y);
}
dfs(1,0);
RMQ();
while(q--)
{
fin>>x>>y;
lac=lca(x,y);
kon=max(query(x,lvl[x]-lvl[lac]),query(y,lvl[y]-lvl[lac]));
fout<<kon<<"\n";
}
return 0;
}