Pagini recente » Cod sursa (job #532681) | Cod sursa (job #3238343) | Cod sursa (job #424102) | Cod sursa (job #3223704) | Cod sursa (job #1830783)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
#define nmax 15500
#define mp make_pair
#define f first
#define s second
vector <pair <int,pair<int,int> > > edge;
vector <pair<int,int> >v[nmax];
int t[nmax];
int poz[nmax];
int viz[nmax];
int w[nmax*2+1000];
int arb[nmax*4+1000];
int k,n,q,i,m;
int r(int x)
{
if(!t[x])
return x;
t[x]=r(t[x]);
return t[x];
}
void euler(int x,int cst)
{
viz[x]=1;
w[k]=cst;
poz[x]=k++;
int last;
for(auto it:v[x])
{
if(viz[it.s])
continue;
euler(it.s,last=it.f);
w[k++]=last;
}
}
void build()
{
for(int i=k-1; i>0; --i)
arb[i]=max(arb[i<<1],arb[i<<1|1]);
}
int query(int l,int r)
{
int ans = 0;
for( l=l+k, r=r+k; l<r; l>>=1,r>>=1)
{
if(l&1)
ans=max(ans,arb[l++]);
if(r&1)
ans=max(ans,arb[--r]);
}
return ans;
}
int main()
{
fin>>n>>m>>q;
for(i=0; i<m; ++i)
{
int x,y,c;
fin>>x>>y>>c;
edge.push_back(mp(c,mp(x,y)));
}
vector <int> graf;
sort(edge.begin(),edge.end());
for(i=0; i<m; ++i)
{
int a = r(edge[i].s.f);
int b = r(edge[i].s.s);
if(a != b)
{
t[a]=b;
graf.push_back(i);
}
}
for(i=0; i<graf.size(); ++i)
{
v[edge[graf[i]].s.f].push_back(mp(edge[graf[i]].f,edge[graf[i]].s.s));
v[edge[graf[i]].s.s].push_back(mp(edge[graf[i]].f,edge[graf[i]].s.f));
}
k=0;
euler(1,0);
for(i=0; i<k; ++i)
arb[i+k]=w[i];
build();
while(q--)
{
int a,b;
fin>>a>>b;
a=poz[a];
b=poz[b];
if(a>b)
swap(a,b);
fout<<query(a+1,b+1)<<'\n';
}
}