Pagini recente » Cod sursa (job #1152348) | Cod sursa (job #1145602) | Cod sursa (job #1917661) | Cod sursa (job #2430429) | Cod sursa (job #974222)
Cod sursa(job #974222)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int N = 100005;
const int E = N * 2;
const int L = 19;
int n, m, nr, t[N], h[N], first[N], euler[E], lg[E], rmq[L][E];
vector <int> a[N];
void DFS(int x, int lev)
{
nr++;
h[nr] = lev;
euler[nr] = x;
first[x] = nr;
for(unsigned i=0; i<a[x].size(); i++)
{
DFS(a[x][i], lev+1);
nr++;
euler[nr] = x;
h[nr] = lev;
}
}
void RMQ()
{
for(int i=2; i<=nr; i++)
lg[i] = lg[i>>1] + 1;
for(int i=1; i<=nr; i++)
rmq[0][i] = i;
for(int i=1; (1 << i) <= nr; i++)
for(int j=1; j <= nr - (1 << i); j++)
{
const int l = (1 << (i-1));
rmq[i][j] = rmq[i-1][j];
if(h[rmq[i][j]] > h[rmq[i-1][j+l]])
rmq[i][j] = rmq[i-1][j+l];
}
}
void LCA(int x, int y)
{
x = first[x], y = first[y];
if(x > y) swap(x, y);
const int l = lg[y-x+1];
int poz = rmq[l][x];
if(h[poz] > h[rmq[l][y-(1<<l)+1]])
poz = rmq[l][y-(1<<l)+1];
fout<<euler[poz]<<'\n';
}
int main()
{
fin>>n>>m;
int x, y;
for(int i=2; i<=n; i++)
{
fin>>x;
a[x].push_back(i);
}
DFS(1, 0);
RMQ();
while(m--)
{
fin>>x>>y;
LCA(x, y);
}
return 0;
}