Cod sursa(job #2601134)

Utilizator etienAndrone Stefan etien Data 13 aprilie 2020 20:26:33
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include<fstream>
#include<cmath>
#include<vector>
#include<iostream>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,q,i,f,a,b,timp;
vector<int>v[100001];
bool viz[100001];
int t[100001],d[100001];
vector<int>vt;
pair<int,int>mat[18][300001];
void adauga(int a,int b)
{
    v[a].push_back(b);
    v[b].push_back(a);
}
void dfs(int vf)
{
    viz[vf]=true;
    vt.push_back(vf);
    t[vf]=vt.size()-1;
    for(int i=0; i<v[vf].size(); i++)
    {
        int fiu=v[vf][i];
        if(!viz[fiu])
        {
            d[fiu]=d[vf]+1;
            dfs(fiu);
            vt.push_back(vf);
            t[vf]=vt.size()-1;
        }
    }
}
int main()
{
    fin>>n>>q;
    for(i=2; i<=n; i++)
    {
        fin>>f;
        adauga(f,i);
    }
    dfs(1);
    for(i=0; i<vt.size(); i++)
        {
            mat[0][i].first=d[vt[i]];
            mat[0][i].second=vt[i];
        }
    for(i=1; i<=17; i++)
    {
        int p=(1<<i);
        for(int j=0; j<=(int)vt.size()-p; j++)
        {
            mat[i][j]=min(mat[i-1][j],mat[i-1][j+p/2]);
        }
    }
    for(i=1; i<=q; i++)
    {
        fin>>a>>b;
        if(t[b]<t[a])
            swap(a,b);
        int p=log2(t[b]-t[a]+1);
        fout<<(min(mat[p][t[a]],mat[p][t[b]-(1<<p)+1])).second<<"\n";
    }
}