Mai intai trebuie sa te autentifici.
Cod sursa(job #2685440)
Utilizator | 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;
}