Cod sursa(job #3197256)

Utilizator Theo20067Cismaru Theodor-Alexe Theo20067 Data 26 ianuarie 2024 11:20:52
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream fin ("lca.in");
ofstream fout("lca.out");
int n,m,i,k,x,y,j,l,t,st[100001],dr[100001],P[100001],D[20][100001];
vector <int> V[100001];

void dfs(int nod)
{
    st[nod]=++k;
    for(int j=0;j<V[nod].size();j++)
        dfs(V[nod][j]);
    dr[nod]=++k;
}
void stramosi()
{
    for(int i=1;i<=n;i++)
        D[0][i]=P[i];
    for(int i=1;i<=19;i++)
        for(int j=1;j<=n;j++)
            D[i][j]=D[i-1][D[i-1][j]];

}
bool parent(int x,int y){return st[x]<=st[y]&&dr[y]<=dr[x];}
int lca(int x,int y)
{
    if(parent(x,y))
        return x;
    if(parent(x,y))
        return y;
    for(int i=19;i>=0;i--)
    {
        int nod=D[i][x];
        if(nod!=0&&!parent(nod,y))
            x=nod;
    }
    return D[0][x];
}
int main()
{
    fin>>n>>m;
    for(i=2;i<=n;i++)
    {
        fin>>P[i];
        V[P[i]].push_back(i);
    }
    dfs(1);
    stramosi();
    for(i=1;i<=m;i++)
    {
        fin>>x>>y;
        fout<<lca(x,y)<<"\n";
    }
    return 0;
}