Pagini recente » Cod sursa (job #1973327) | Cod sursa (job #2909498) | Cod sursa (job #1896958) | Cod sursa (job #3179695) | Cod sursa (job #1327600)
#include <fstream>
#include <vector>
using namespace std;
ifstream is("lca.in");
ofstream os("lca.out");
int n, m;
int a, b, cnt;
vector<int> log2, poz, niv, E;
vector<vector<int>> g, answ;
void Df(int nod, int nv);
void Read();
void Query();
void RMQ();
int main()
{
Read();
Df(1, 1);
RMQ();
Query();
is.close();
os.close();
return 0;
}
void RMQ()
{
int N = 2 * n - 1;
for ( int i = 1; i <= N; ++i )
answ[i][0] = i;
for ( int j = 1; ( 1 << j ) <= N; ++j )
for ( int i = 1; i + ( 1 << j ) - 1 <= N; ++i )
if ( niv[answ[i][j - 1]] < niv[answ[i + (1 << (j - 1))][j - 1]] )
answ[i][j] = answ[i][j - 1];
else
answ[i][j] = answ[i + (1 << (j - 1))][j - 1];
}
void Df(int nod, int nv)
{
E[++cnt] = nod;
niv[cnt] = nv;
poz[nod] = cnt;
for ( const auto& nodv : g[nod] )
{
Df(nodv, nv + 1);
E[++cnt] = nod;
niv[cnt] = nv;
}
}
void Read()
{
int n1;
is >> n >> m;
g = vector<vector<int>>(n + 1);
E = vector<int>(2 * n);
niv = vector<int>(2 * n);
poz = vector<int>(n + 1);
log2 = vector<int>(2 * n);
answ = vector<vector<int>>(2 * n, vector<int>(20));
for ( int i = 2; i <= n; ++i )
{
is >> n1;
g[n1].push_back(i);
}
for ( int i = 2; i < 2 * n; ++i )
log2[i] = log2[i / 2] + 1;
}
void Query()
{
int a, b, x, y, z;
while ( m-- )
{
is >> a >> b;
x = poz[a];
y = poz[b];
if ( x > y )
swap(x, y);
z = log2[y - x + 1];
if ( niv[answ[x][z]] < niv[answ[y - (1 << z) + 1][z]] )
os << E[answ[x][z]] << "\n";
else
os << E[answ[y - (1 << z) + 1][z]] << "\n";
}
}