Pagini recente » Cod sursa (job #563291) | Cod sursa (job #700654) | Cod sursa (job #1321783) | Cod sursa (job #2822127) | Cod sursa (job #1370587)
#include <fstream>
#include <vector>
using namespace std;
ifstream is("lca.in");
ofstream os("lca.out");
vector<vector<int> > g;
vector <int> t;
vector <int> Lev;
int n, m;
int a, b;
int Lca(int x, int y);
void Df(int x, int lev);
int main()
{
is >> n >> m;
g = vector <vector<int> >(n + 1);
t = vector <int>(n+1);
Lev = vector<int> (n+1);
int x, y;
for(int i = 2; i <= n; ++i)
{
is >> t[i];
}
Df(1, 0);
for(int i = 1; i <= m; ++i)
{
is >> x >> y;
os << Lca(x, y) << '\n';
}
is.close();
os.close();
return 0;
}
int Lca(int x, int y)
{
while(x != y)
{
if(Lev[x] > Lev[y])
x = t[x];
else
y = t[y];
}
return x;
}
void Df(int x, int lev)
{
Lev[x] = lev;
for(int i = 1; i <= n; ++i)
{
if(t[i] == x)
Df(i, lev+1);
}
return;
}