Pagini recente » Cod sursa (job #1720429) | Cod sursa (job #1919054) | Cod sursa (job #3305984) | Cod sursa (job #2574680) | Cod sursa (job #3308885)
#include <bits/stdc++.h>
using namespace std;
struct el
{
int x,y,c;
};
el s[30555];
int pr[15555]; /// parent
vector <int> v[15555];
vector <int> p[15555];
bool ord(const el & a,const el & b)
{
if(a.c<b.c)
{
return true;
}
return false;
}
int px(int k)
{
if(pr[k]!=k)
{
pr[k]=px(pr[k]);
}
return pr[k];
}
int d[35555]; ///depth
int nd[35555]; /// nod
int in;
int pt[25]; ///puteri
int rmq[16][35555]; /// pentru lca
int rq[16][35555]; /// pentru drumuri
int pct[16][35555]; /// pentru puncte
void dfs(int k,int h)
{
++in;
d[in]=h;
nd[in]=k;
for(int g=0;g<v[k].size();++g)
{
int a=v[k][g];
int pb=p[k][g];
if(a!=pct[0][k])
{
rq[0][a]=pb;
pct[0][a]=k;
for(int j=1;j<=15;++j)
{
if(((h+1)-pt[j])>=1)
{
rq[j][a]=max(rq[j-1][a],rq[j-1][pct[j-1][a]]);
pct[j][a]=pct[j-1][pct[j-1][a]];
}
else
{
break;
}
}
dfs(a,h+1);
++in;
d[in]=h;
nd[in]=k;
}
}
}
int f[35555];
int main()
{
ifstream cin("radiatie.in");
ofstream cout("radiatie.out");
int n,m,kk;
cin>>n>>m>>kk;
for(int i=1;i<=m;++i)
{
cin>>s[i].x>>s[i].y>>s[i].c;
}
for(int i=1;i<=n;++i)
{
pr[i]=i;
}
sort(s+1,s+m+1,ord);
for(int i=1;i<=m;++i)
{
int xx,yy;
xx=px(pr[s[i].x]);
yy=px(pr[s[i].y]);
if(xx!=yy)
{
pr[xx]=yy;
v[s[i].x].push_back(s[i].y);
v[s[i].y].push_back(s[i].x);
p[s[i].x].push_back(s[i].c);
p[s[i].y].push_back(s[i].c);
}
}
pt[0]=1;
for(int i=1;i<=15;++i)
{
pt[i]=pt[i-1]*2;
}
pct[0][1]=-1;
dfs(1,1);
for(int i=1;i<=in;++i)
{
if(f[nd[i]]==0)
{
f[nd[i]]=i;
}
}
for(int i=1;i<=in;++i)
{
rmq[0][i]=i;
}
for(int h=1;h<=15;++h)
{
for(int i=1;i+pt[h]-1<=in;++i)
{
if(d[rmq[h-1][i]]<=d[rmq[h-1][i+pt[h-1]]])
{
rmq[h][i]=rmq[h-1][i];
}
else
{
rmq[h][i]=rmq[h-1][i+pt[h-1]];
}
}
}
int xa,ya,x,y;
for(int i=1;i<=kk;++i)
{
cin>>xa>>ya;
x=f[xa];
y=f[ya];
if(y<x)
{
swap(x,y);
}
int l=y-x+1;
int st=0,dr=15,mij,in=-1;
while(st<=dr)
{
mij=(st+dr)/2;
if(pt[mij]<=l)
{
st=mij+1;
in=mij;
}
else
{
dr=mij-1;
}
}
int nod=min(d[rmq[in][x]],d[rmq[in][y-pt[in]+1]]);
int xl,yl;
xl=d[f[xa]];
yl=d[f[ya]];
x=xa;
y=ya;
int mx=0;
while(xl!=nod)
{
st=0;
dr=15;
while(st<=dr)
{
mij=(st+dr)/2;
if(xl-pt[mij]>=nod)
{
st=mij+1;
in=mij;
}
else
{
dr=mij-1;
}
}
if(rq[in][x]>mx)
{
mx=rq[in][x];
}
x=pct[in][x];
xl-=pt[in];
}
while(yl!=nod)
{
st=0;
dr=15;
while(st<=dr)
{
mij=(st+dr)/2;
if(yl-pt[mij]>=nod)
{
st=mij+1;
in=mij;
}
else
{
dr=mij-1;
}
}
if(rq[in][y]>mx)
{
mx=rq[in][y];
}
y=pct[in][y];
yl-=pt[in];
}
cout<<mx<<"\n";
}
return 0;
}