Mai intai trebuie sa te autentifici.

Cod sursa(job #2685440)

Utilizator mihail.ungureanuUngureanu Mihail mihail.ungureanu Data 16 decembrie 2020 22:25:04
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <vector>
#include <fstream>
 
using namespace std;
 
#define MAX_N 100005
#define INF 0x3f3f3f3f
 
#define foreach(V) for(typeof (V).begin() it = (V).begin(); it != (V).end(); ++it)
#define nst (nod << 1)
#define ndr (nst | 1)
#define mij ((li + lf) >> 1)
 
int K, N_segment, M_segment, P;
int L[MAX_N << 1], H[MAX_N << 1],Lg[MAX_N << 1], First[MAX_N];
int A[MAX_N << 4], st, dr, sol, hsol;
 
vector <int> G[MAX_N];
  
void dfs_segment(int nod, int lev)
{
	H[++K] = nod; 
	L[K] = lev; 
	First[nod] = K; 
 
	foreach(G[nod])
	{
		dfs_segment(*it, lev+1);
		
		H[++K] = nod;
		L[K] = lev;
	}
}
 
void build(int nod, int li, int lf)
{
	if(li == lf)
	{
		A[nod] = li;
		return;
	}
 
	build(nst, li, mij);
	build(ndr, mij+1, lf);
 
	if(L[A[nst]] <= L[A[ndr]])
		A[nod] = A[nst];
	else
		A[nod] = A[ndr];
}
 
void query(int nod, int li, int lf)
{
	if(st <= li && lf <= dr)
	{
		if(L[A[nod]] < hsol)
			sol = H[A[nod]],
			hsol = L[A[nod]];
		return;
	}
 
	if(st <= mij) query(nst, li, mij);
	if(mij < dr)  query(ndr, mij+1, lf);
}
 
int lca_segment(int x, int y)
{
	st = First[x], dr = First[y];
	if(st > dr) swap(st, dr);
	sol = hsol = INF;
	query(1, 1, K);
 
	return sol;
}
 
int Segment(char* inputfile, char* outputfile)
{	clock_t tic = clock();
	ifstream fin;
    ofstream fout;
    fin.open(inputfile);
    fout.open(outputfile);
	fin >> N_segment >> M_segment;
	
	for(int i = 2; i <= N_segment; ++i)
	{
		int x;
		fin >> x;
		G[x].push_back(i);
	}
	dfs_segment(1, 0);
	build(1, 1, K);
 
	while(M_segment--)
	{
		int x, y;
		fin >> x >> y;
		fout << lca_segment(x, y) << "\n";
	}
	clock_t toc = clock();

    printf(" Segment elapsed: %f seconds\n", (double)(toc - tic) / CLOCKS_PER_SEC);
	return M_segment;
}