Pagini recente » Cod sursa (job #1340943) | Autentificare | Cod sursa (job #1864469) | Cod sursa (job #2828746) | Cod sursa (job #3133952)
#include <fstream>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std;
using pii = pair<int,int>;
ifstream cin("radiatie.in");
ofstream cout("radiatie.out");
const int MAX = 3e4+1;
struct muchie{
int x , y , c;
};
bool crit( muchie r , muchie l){
return r.c < l.c;
}
vector <muchie> edges;
int qx , qy , a , b , c , d , n , m , q;
struct DSU{
int h[MAX] , t[MAX] , ind , k=0 , niv[MAX]
, level=0 , log[2*MAX] , rmq[17][MAX*2] , val[MAX] , poz[MAX];
bool viz[MAX];
vector <int> g[MAX];
void init(){
for(int i = 1 ; i <= n ; i++){
h[i] = t[i] = val[i] = 0;
}
ind = n+1;
}
void findc( int &x ){
while(t[x]) x = t[x];
}
void unionp( int &x , int &y , int &c){
findc(x);
findc(y);
if(x == y) return;
t[x] = t[y] = ind;
g[ind].push_back(x);
g[ind].push_back(y);
val[ind] = c;
ind++;
}
void euler( int x ){
viz[x] = 1;
rmq[0][++k] = x;
poz[x] = k;
niv[x] = level;
for(auto it : g[x]){
if(!viz[it]){
level++;
euler(it);
rmq[0][++k] = x;
}
}
level--;
}
void preproclca(){
int u = 1;
findc(u);
euler(u);
log[0] = -1;
for(int i = 1 ; i <= k ; i++){
log[i] = log[i/2] + 1;
}
for(int i = 1 ; i <= log[k] ; i++){
for(int j = (1<<i) ; j <= k ; j++){
if(niv[rmq[i-1][j]] < niv[rmq[i-1][j-(1<<(i-1))]]){
rmq[i][j] = rmq[i-1][j];
}else rmq[i][j] = rmq[i-1][j-(1<<(i-1))];
}
}
}
int lca( int x , int y ){
x = poz[x];
y = poz[y];
if(x > y) swap(x,y);
int lenght = y - x + 1;
if(niv[rmq[log[lenght]][y]] < niv[rmq[log[lenght]][x+(1<<log[lenght])-1]]){
return val[rmq[log[lenght]][y]];
}else return val[rmq[log[lenght]][x+(1<<log[lenght])-1]];
}
}uf;
signed main(){
cin >> n >> m >> q;
int x , y;
uf.init();
for(int i = 1 ; i <= m ; i++){
cin >> x >> y >> c;
edges.push_back({x,y,c});
}
sort(edges.begin(),edges.end(),crit);
for(auto it : edges){
uf.unionp(it.x,it.y,it.c);
}
uf.preproclca();
while(q--){
cin >> qx >> qy;
cout << uf.lca(qx,qy) << '\n';
}
return 0;
}