Pagini recente » Cod sursa (job #1443564) | Statistici Valeri (blackie) | Statistici Szasz Zoltan (ZoLeeKha) | Cod sursa (job #1710740) | Cod sursa (job #1732285)
#include<stdio.h>
#include<vector>
#define max 100001
#define h 300 // h inaltimea arborelui
int tata[max], stramos[max];
int n, m, nivel[max], x, y,i;
std::vector<int> fiu[max];
void dfs(int nod, int nod1, int niv)
{
int i;
stramos[nod]=nod1;
nivel[nod]=niv;
if(niv % h == 0) //nu sunt pe ultimul nivel
nod1=nod;
for(i=0; i<fiu[nod].size(); i++) //pentru fiecare fiu i al nodului aplic dfs
{
dfs(fiu[nod][i], nod1, niv+1);
}
}
int LCA( int x, int y)
{
//cat timp nodurile x si y nu au acelasi stramos
//alegem nodul care e situat cel mai aproape de cel mai mic nivel
while(stramos[x] != stramos[y])
{
if(nivel[x] > nivel[y])
x=stramos[x];
else
y=stramos[y];
}
//sunt in aceeasi sectiune
while(x != y)
{
if(nivel[x] > nivel[y])
x=tata[x];
else
y=tata[y];
}
return x;
}
int main()
{
FILE *inputFile, *outputFile;
inputFile=fopen("lca.in", "r");
outputFile=fopen("lca.out", "w");
fscanf(inputFile, "%d %d", &n, &m);
for(i=2; i<=n; i++)
{
fscanf(inputFile, "%d", &tata[i]);
fiu[tata[i]].push_back(i);
}
dfs(1, 1, 0);
for(i=1; i<=m; i++)
{
fscanf(inputFile, "%d %d", &x, &y);
int lca=LCA(x,y);
fprintf(outputFile, "%d\n",lca);
}
return 0;
}