Pagini recente » Cod sursa (job #1355683) | Cod sursa (job #1459246) | Cod sursa (job #1985786) | Cod sursa (job #1068675) | Cod sursa (job #1197249)
#include <cstdio>
#include <vector>
#include <utility>
#define MX 100001
#define minim(a,b) ((a<b) ? a : b)
using namespace std;
FILE *fin, *fout;
int n,m;
vector<int> c[MX];
vector<int> eul;
int niv[MX], ap[MX];
int nr1,nr2;
void citire()
{
int i,x;
fscanf(fin, "%d%d", &n, &m);
for(i=2; i<=n; i++)
{
fscanf(fin, "%d", &x);
c[x].push_back(i);
}
}
void repr_euler(int p)
{
vector<int>::iterator it;
eul.push_back(p);
if(ap[p] == 0)
{
ap[p] = eul.size()-1;
}
for(it=c[p].begin(); it!=c[p].end(); it++)
{
repr_euler(*it);
eul.push_back(p);
}
}
void nivel(int p)
{
vector<int>::iterator it;
for(it=c[p].begin(); it!=c[p].end(); it++)
{
niv[*it] = niv[p]+1;
nivel(*it);
}
}
/*void afisare()
{
vector<int>::iterator it;
it = eul.begin(); it++;
for(; it!=eul.end(); it++) fout<<*it<<' ';
fout<<'\n';
it = eul.begin(); it++;
for(; it!=eul.end(); it++) fout<<niv[*it]<<' ';
fout<<'\n'<<ap[3];
}*/
int lca()
{
int a,b,m,i,x,t;
a = ap[nr1];
b = ap[nr2];
m = 2000000;
for(; a<=b; a++)
{
i = eul[a];
x = minim(m, niv[i]);
if(x < m)
{
m = x;
t = i;
}
}
return t;
}
int main()
{
fin = fopen("lca.in", "r");
fout = fopen("lca.out", "w");
citire();
eul.push_back(0);
repr_euler(1);
nivel(1);
//afisare();
int i;
for(i=1; i<=m; i++)
{
fscanf(fin, "%d%d", &nr1, &nr2);
if(ap[nr1] > ap[nr2]) swap(nr1, nr2);
fprintf(fout, "%d\n", lca());
}
fclose(fin); fclose(fout);
return 0;
}