Pagini recente » Cod sursa (job #3150672) | Cod sursa (job #2008797) | Cod sursa (job #1287568) | Cod sursa (job #35964) | Cod sursa (job #2805940)
#include <bits/stdc++.h>
using namespace std;
ifstream f ("radiatie.in");
ofstream g ("radiatie.out");
int n;
int m;
int q;
vector <pair<int,int >> v[50005];
int parinte[100005];
int lini[100005];
struct ceva
{
int a;
int b;
int pret;
};
ceva muchie[150005];
int cmp(ceva A, ceva B)
{
if(A.pret<B.pret)
return 1;
return 0;
}
int Find(int x)
{
int copiex=x;
while(parinte[copiex]!=0)
{
copiex=parinte[copiex];
}
int aux=x;
while(parinte[x]!=0)
{
aux=x;
x=parinte[x];
parinte[aux]=copiex;
}
return copiex;
}
void Union(int x, int y)
{
parinte[x]=y;
}
int lung;
int primap[100005];
int nivel[100005];
int rmq[25][50005];
int vecsus[25][50005];
int a[25][50005];
int b[25][50005];
int bag=-1;
void DFS(int nod, int tata, int val)
{
nivel[nod]=nivel[tata]+1;
lini[++lung]=nod;
primap[nod]=min(primap[nod], lung);
int x=log2(nivel[nod]);
a[0][nod]=tata;
b[0][nod]=val;
for(int i=1; i<=x; ++i)
{
a[i][nod]=a[i-1][a[i-1][nod]];
b[i][nod]=max(b[i-1][nod], b[i-1][a[i-1][nod]]);
}
for(int x=0; x<v[nod].size(); ++x)
{
if(v[nod].size()==1)
++bag;
if(v[nod][x].first!=tata)
{
DFS(v[nod][x].first, nod, v[nod][x].second);
lini[++lung]=nod;
}
}
}
int query(int fiu , int dist)
{
if(dist==0)
return 0;
int x=log2(dist);
return max(b[x][fiu] , query(a[x][fiu] , dist-pow(2 ,x)) );
}
int main()
{
f>>n>>m>>q;
for(int i=1; i<=m; ++i)
{
int a, b, cost;
f>>a>>b>>cost;
muchie[i].a=a;
muchie[i].b=b;
muchie[i].pret=cost;
}
sort(muchie+1, muchie+m+1, cmp);
int bagate=0;
for(int i=1; i<=n; ++i)
primap[i]=1000000000;
for(int i=1; i<=n; ++i)
{
int prim=muchie[i].a;
int secund=muchie[i].b;
int x=Find(prim);
int y=Find(secund);
if(x!=y)
{
Union(x, y);
++bagate;
v[prim].push_back({secund, muchie[i].pret});
v[secund].push_back({prim, muchie[i].pret});
}
if(bagate==n-1)
break;
}
DFS(1, 0, 0);
int x=log2(lung);
for(int i=1; i<=lung; ++i)
rmq[0][i]=nivel[lini[i]];
for(int i=1; i<=x; ++i)
{
for(int j=1; j<=lung-pow(2, i)+1; ++j)
{
int l=j+pow(2, i-1);
rmq[i][j]=min(rmq[i-1][j], rmq[i-1][l]);
}
}
for(int i=1; i<=q; ++i)
{
int prim;
int secund;
f>>prim>>secund;
int poza=min(primap[prim], primap[secund]);
int pozb=max(primap[prim], primap[secund]);
int x=log2(pozb-poza);
int l=pozb-pow(2, x)+1;
int sus=min(rmq[x][poza], rmq[x][l]);
g<<max(query(prim , nivel[prim]-nivel[sus]) , query(secund , nivel[secund]-nivel[sus]))<<"\n";
}
return 0;
}