Pagini recente » Cod sursa (job #1490937) | Rezultatele filtrării | Cod sursa (job #1704329) | Cod sursa (job #308478) | Cod sursa (job #1414707)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int N, x, Euler[200005], lg[200005], Lvl[100005], nr, First[200005], rmq[19][200005], y, M;
vector <int> G[100005];
void dfs(int nod, int level)
{
Euler[++nr]=nod; Lvl[nod]=level; First[nod]=nr;
vector<int>::iterator it=G[nod].begin();
for (; it!=G[nod].end(); ++it)
dfs(*it, level+1), Euler[++nr]=nod;
}
int lca(int n1, int n2)
{
int st=First[n1], dr=First[n2];
if (st>dr) swap(st, dr);
int l=lg[dr-st+1];
x=rmq[l][st]; y=rmq[l][dr-(1<<l)+1];
if (Lvl[x]<Lvl[y]) return x;
return y;
}
int main()
{
f>>N>>M;
for (int i=1; i<N; ++i)
f>>x, G[x].push_back(i+1);
dfs(1, 1); rmq[0][1]=Euler[1];
for (int i=2; i<=nr; ++i)
rmq[0][i]=Euler[i], lg[i]=lg[i/2]+1;
for (int i=1; (1<<i)<=nr; ++i)
for (int j=1; j<=nr-(1<<i); ++j)
{
x=rmq[i-1][j]; y=rmq[i-1][j+(1<<(i-1))];
if (Lvl[x]<Lvl[y]) rmq[i][j]=x;
else rmq[i][j]=y;
}
while (M--)
f>>x>>y, g<<lca(x, y)<<'\n';
return 0;
}