Pagini recente » Cod sursa (job #738545) | Cod sursa (job #431760) | Cod sursa (job #2634984) | Cod sursa (job #1888914) | Cod sursa (job #1333632)
#include <fstream>
#include <vector>
using namespace std;
ifstream is("lca.in");
ofstream os("lca.out");
const int SIZE = 100001;
vector<int> v[SIZE];
int N, M;
int cnt;
int E[2*SIZE], niv[2*SIZE], poz[SIZE], log[SIZE];
long long rmq[2*SIZE][19];
void DF(int x, int nv)
{
cnt++;
E[cnt] = x, niv[cnt] = nv, poz[x] = cnt;
for ( int i = 0; i < v[x].size(); ++i )
{
DF(v[x][i], nv+1);
cnt++;
E[cnt] = x, niv[cnt] = nv;
}
}
void RMQ()
{
for ( int i = 1; i <= cnt; ++i )
rmq[i][0] = i;
for ( int j = 1; (1 << j) <= cnt; ++j )
for ( int i = 1; i + (1 << j) - 1 <= cnt; ++i )
{
if ( niv[rmq[i][j-1]] < niv[rmq[i + (1 << (j-1))][j-1]] )
rmq[i][j] = rmq[i][j-1];
else
rmq[i][j] = rmq[i + (1 << (j-1))][j-1];
}
}
int LCA(int x, int y)
{
int k;
for ( int i = 2; i <= cnt; ++i )
log[i] = log[i/2] + 1;
int st, dr;
st = poz[x];
dr = poz[y];
if ( st > dr )
swap(st, dr);
k = log[dr-st + 1];
if ( niv[rmq[st][k]] > niv[rmq[dr - (1 << k) + 1][k]] )
return E[rmq[dr - (1 << k) + 1][k]];
return E[rmq[st][k]];
}
int main()
{
int x, y;
is >> N >> M;
for ( int i = 2; i <= N; ++i )
{
is >> x;
v[x].push_back(i);
}
DF(1, 1);
RMQ();
for ( int i = 1; i <= M; ++i )
{
is >> x >> y;
os << LCA(x, y) << '\n';
}
is.close();
os.close();
return 0;
}