Cod sursa(job #2098474)

Utilizator sandupetrascoPetrasco Sandu sandupetrasco Data 2 ianuarie 2018 21:15:02
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <bits/stdc++.h>

#define pb push_back 
#define x first 
#define y second 
#define MOD 1000000007

using namespace std;
typedef long long ll;
typedef pair< int , int > PII;
const int dirx[] = {-2,-1,1,2, 1, -1};
const int diry[] = {0,1,1,0, -1, -1};

int pozr;
char buffer[1010];
FILE *fi, *fo;
          
char getch(){
    if( pozr == 1010 ){
        fread( buffer, 1010, 1, fi  );
        pozr = 0;
    }
    return buffer[ pozr++ ];
}
          
void read(int &nr){
	nr = 0;
    char ch = getch();
    while( isdigit(ch) == 0 )
        ch = getch();
    while( isdigit(ch) != 0 ){
        nr = nr * 10 + ch - '0';
        ch = getch();
    }
}

int n, m, k, U[1 << 18], Lvl[1 << 18], F[1 << 18], RS[1 << 18];
vector < int > V[1 << 18];
unordered_map < int , int > M;

struct my{
	int x, y, z;
} A[1 << 18];


void make_DFS(int x,int lvl){
	Lvl[x] = lvl;
	for (auto it : V[x])
		make_DFS(it, lvl + 1);
}


int get_LCA(int x, int y){
	int mx = 0;

	if (Lvl[x] < Lvl[y]) swap(x, y);

	while (Lvl[x] > Lvl[y]){
		mx = max(mx, RS[x]);
		x = U[x];
	}

	while (x != y){
		mx = max({mx, RS[x], RS[y]});
		x = U[x], y = U[y];
	}

	return mx;
}

int find(int x){ while (U[x]) x = U[x]; return x;}
void unite(int x, int y){ U[x] = y; }

int main(){
	fi = fopen("radiatie.in", "r");
	fo = fopen("radiatie.out", "w");
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	read(n), read(m), read(k);

	for (int i = 1; i <= m; i++)
		read(A[i].x), read(A[i].y), read(A[i].z);

	sort(A + 1, A + m + 1, [&](my a, my b){return a.z < b.z;});

	for (int i = 1; i <= m; i++){
		int a = find(A[i].x), b = find(A[i].y);
		if (a != b){
			unite(a, b);
			RS[a] = A[i].z;
			V[b].pb(a);
		}
	}
	int cnt = 1;
	while (U[cnt++]);
	make_DFS(cnt, Lvl[cnt]);

	for (int i = 1, x, y; i <= k; i++){
		read(x), read(y);
		fprintf(fo, "%d\n", get_LCA(x, y));
	}

	return 0;
}