Pagini recente » Cod sursa (job #2950819) | Cod sursa (job #1606473) | Cod sursa (job #72135) | Cod sursa (job #2770857) | Cod sursa (job #1375436)
#include <fstream>
#include <vector>
using namespace std;
ifstream is("lca.in");
ofstream os("lca.out");
const int MaxN = 100001;
vector<int> E, Lvl, Pos, log2;
vector<vector<int> > G;
int r[2 * MaxN][20];
int n, m, nr;
void Read();
void Df(int node, int lvl);
void RMQ();
int Lca(int x, int y);
int main()
{
Read();
Df(1, 1);
RMQ();
// for ( const int& p : Lvl )
// os << p << ' ' ;
int x, y;
for ( int i = 1; i <= m; ++i )
{
is >> x >> y;
os << Lca(x, y) << '\n';
}
is.close();
os.close();
return 0;
}
void Read()
{
is >> n >> m;
E = vector<int>(2 * n + 2);
Lvl = vector<int>(2 * n + 2);
Pos = vector<int>(n + 1);
log2 = vector<int>(2 * n + 2);
G = vector<vector<int> >(n + 1);
int node;
for ( int i = 2; i <= n; ++i )
{
is >> node;
G[node].push_back(i);
}
for ( int i = 2; i <= 2 * n - 1; ++i )
log2[i] = log2[i / 2] + 1;
}
void Df(int node, int lvl)
{
nr++;
E[nr] = node;
Lvl[nr] = lvl;
Pos[node] = nr;
for ( const auto& g : G[node] )
{
Df(g, lvl + 1);
nr++;
E[nr] = node;
Lvl[nr] = lvl;
}
}
void RMQ()
{
for ( int i = 1; i <= 2 * n - 1; ++i )
r[i][0] = i;
for ( int j = 1; (1 << j) <= 2 * n - 1; ++j )
for ( int i = 1; i + (1 << j) <= 2 * n; ++i )
if ( Lvl[r[i][j - 1]] < Lvl[r[i + (1 << (j - 1))][j - 1]] )
r[i][j] = r[i][j - 1];
else
r[i][j] = r[i + (1 << (j - 1))][j - 1];
}
int Lca(int x, int y)
{
x = Pos[x];
y = Pos[y];
if ( x > y )
swap(x, y);
int k = log2[y - x + 1];
if ( Lvl[r[x][k]] < Lvl[r[y - (1 << k) + 1][k]] )
return E[r[x][k]];
return E[r[y - (1 << k) + 1][k]];
}