Cod sursa(job #2272679)

Utilizator PredescuSebastianIonPredescu Sebastian Ion PredescuSebastianIon Data 30 octombrie 2018 16:10:30
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
struct efectiv_ceva
{
    int nod,niv;
}a[100003];
int nr,poz[100003],n,m,x,y,d[22][100003],val;
bool marker[100003];
vector <int >g[100003];
void dfs(int nod,int niv)
{
    marker[nod]=true;
    a[++nr].nod=nod;
    a[nr].niv=niv;
    poz[nod]=nr;
    for(int i=0;i<g[nod].size();i++)
    {
        if(marker[g[nod][i]]==false)
        {
            marker[g[nod][i]]=true;
            dfs(g[nod][i], niv+1);
            a[++nr].nod=nod;
            a[nr].niv=niv;
        }
    }
}
int solve(int x,int y)
{
    x=poz[x];
    y=poz[y];
    if(x>y)swap(x,y);
    if(x==y)return a[x].nod;
    int k=log2(y-x+1);
    if(a[d[k][x]].niv<a[d[k][y-(1<<k)+1]].niv)
        return a[d[k][x]].nod;
    else return a[d[k][y-(1<<k)+1]].nod;
}
int main()
{
    fin>>n>>m;
    for(int i=2;i<=n;i++)
    {
        fin>>x;
        g[x].push_back(i);
    }
    dfs(1,1);
    val=2*n-1;
    for(int i=1;i<=val;i++)
    {
        d[0][i]=i;
    }
    for(int i=1;i<=log2(val);i++)
    {
        for(int j=1;j<=(val-(1<<i)+1);j++)
        {
            if(a[d[i-1][j+(1<<(i-1))]].niv<a[d[i-1][j]].niv)
            {
                d[i][j]=d[i-1][j+(1<<(i-1))];
            }
            else d[i][j]=d[i-1][j];
        }
    }
    for(int i=1;i<=m;i++)
    {
        fin>>x>>y;
        fout<<solve(x,y)<<'\n';
    }
    return 0;
}