Cod sursa(job #2308065)

Utilizator SchnitzelMannPavaloiu Gabriel SchnitzelMann Data 26 decembrie 2018 12:16:20
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
vector<int> v[100002];
int k,a[200002],l[200002],lg[200002],f[100002],r[200002][20];
void dfs(int nr,int lv)
{
    a[++k]=nr;
    l[k]=lv;
    f[nr]=k;
    for(auto it:v[nr])
    {
        dfs(it,lv+1);
        a[++k]=nr;
        l[k]=lv;
    }
}
int main()	
{
    int n,m,i,j,nr;
    in>>n>>m;
    for(i=2;i<=n;i++)
    {
        in>>nr;
        v[nr].push_back(i);
    }
    dfs(1,0);
    for(i=2;i<=k;i++)
        lg[i]=lg[i/2]+1,r[i][0]=i;
    r[1][0]=1;
    for(j=0;j<=lg[k];j++)
        for(i=0;i+(1<<j)<=k;i++)
            if(l[r[i][j]]>l[r[i+(1<<j)][j]])
                r[i][j+1]=r[i+(1<<j)][j];
            else
                r[i][j+1]=r[i][j];
    while(m--)
    {
        in>>i>>j;
        i=f[i];j=f[j];
        if(i>j)
            swap(i,j);
        nr=lg[j-i+1];
        if(l[r[i][nr]]>l[r[j-(1<<nr)+1][nr]])
            out<<a[r[j-(1<<nr)+1][nr]]<<"\n";
        else
            out<<a[r[i][nr]]<<"\n";
    }
    return 0;
}