Pagini recente » Cod sursa (job #2931950) | Cod sursa (job #2529133) | Cod sursa (job #2668772) | Cod sursa (job #519041) | Cod sursa (job #2805772)
#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 bag=-1;
void DFS(int nod, int tata)
{
nivel[nod]=nivel[tata]+1;
lini[++lung]=nod;
primap[nod]=min(primap[nod], lung);
for(int x=0; x<v[nod].size(); ++x)
{
if(v[nod].size()==1)
++bag;
if(v[nod][x].first!=tata)
{
rmq[0][++bag]=v[nod][x].second;
DFS(v[nod][x].first, nod);
rmq[0][++bag]=v[nod][x].second;
}
}
lini[++lung]=nod;
}
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);
int x=log2(lung);
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]=max(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=max(rmq[x][poza], rmq[x][l]);
g<<sus<<"\n";
}
return 0;
}