Pagini recente » Cod sursa (job #1460259) | Cod sursa (job #2259724) | Cod sursa (job #1385060) | Cod sursa (job #1768205) | Cod sursa (job #2395421)
#include <stdio.h>
#include <vector>
#define h 256
#define NMAX 100005
using namespace std;
FILE *fin = fopen("lca.in", "r");
FILE *fout = fopen("lca.out", "w");
vector <int> fii[NMAX];
int n,m,tata[NMAX],Lev[NMAX],Vitreg[NMAX],x,y,i;
void dfs(int nod, int Tvit, int lev)
{
Lev[nod] = lev;
Vitreg[nod] = Tvit;
if(lev%h == 0)
Tvit = nod;
for(vector<int>:: iterator it=fii[nod].begin(); it!=fii[nod].end(); ++it)
dfs(*it, Tvit, lev+1);
}
int lca(int x, int y)
{
while(Vitreg[x] != Vitreg[y])
if(Lev[x] > Lev[y])
x = Vitreg[x];
else
y = Vitreg[y];
while(x != y)
if(Lev[x] > Lev[y])
x = tata[x];
else
y = tata[y];
return x;
}
int main()
{
fscanf(fin, "%d%d", &n,&m);
for(i=2; i<=n; ++i)
{
fscanf(fin, "%d", &tata[i]);
fii[tata[i]].push_back(i);
}
dfs(1,0,0);
for(i=1; i<=m; ++i)
{
fscanf(fin, "%d%d", &x,&y);
fprintf(fout, "%d\n", lca(x, y));
}
fclose(fin);
fclose(fout);
return 0;
}