Pagini recente » Cod sursa (job #2611759) | Cod sursa (job #228273) | Cod sursa (job #2163919) | Cod sursa (job #2537782) | Cod sursa (job #1370662)
#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;
vector <int> T2;
int n, m;
const int h = 200;
int a, b;
int Lca(int x, int y);
void Df(int x, int lev, int t2);
int main()
{
is >> n >> m;
g = vector <vector<int> > (n + 1);
T = vector <int> (n + 1);
Lev = vector<int> (n + 1);
T2 = vector<int> (n + 1);
int x, y;
for(int i = 2; i <= n; ++i)
{
is >> T[i];
}
Df(1, 0, 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(T2[x] != T2[y])
if(Lev[x] > Lev[y])
x = T2[x];
else
y = T2[y];
while(x != y)
{
if(Lev[x] > Lev[y])
x = T[x];
else
y = T[y];
}
return x;
}
void Df(int x, int lev, int t2)
{
Lev[x] = lev;
T2[x] = t2;
if( lev % h == 0) t2 = n;
for(int i = 1; i <= n; ++i)
{
if(T[i] == x)
Df(i, lev+1, t2);
}
return;
}