Cod sursa(job #2877779)

Utilizator FastmateiMatei Mocanu Fastmatei Data 25 martie 2022 12:33:03
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("lca.in");
ofstream fout("lca.out");

int n,m,k;
int e[200005];
int t[200005];
vector<int>v[200005];
int First[200005];
int rmq[20][400005];
int lev[200005];
int lg[200005];

void DFS(int x,int lv)
{
    e[++k]=x;
    First[x]=k;
    lev[k]=lv;
    for(auto w:v[x])
    {
        DFS(w,lv+1);
        e[++k]=x;
        lev[k]=lv;
    }
}

void RMQ()
{
    for(int i=2;i<=k;i++)
        lg[i]=lg[i/2]+1;
    for(int i=1;i<=k;i++)
        rmq[0][i]=i;
    for(int i=1;i<=lg[k];i++)
        for(int j=1;j<=k-(1<<i)+1;j++)
        {
            rmq[i][j]=rmq[i-1][j];
            if(lev[rmq[i][j]]>lev[rmq[i-1][j+(1<<(i-1))]])
                rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
        }
}

int LCA(int x,int y)
{
    int st,dr,diff;
    st=First[x];
    dr=First[y];
    if(st>dr) swap(st,dr);
    diff=dr-st+1;
    int sol=rmq[lg[diff]][st];
    int sh=diff-(1<<lg[diff]);
    if(lev[sol]>lev[rmq[lg[diff]][st+sh]])
        sol=rmq[lg[diff]][st+sh];
    return e[sol];
}

int main()
{
    fin>>n>>m;
    for(int i=2;i<=n;i++)
    {
        fin>>t[i];
        v[t[i]].push_back(i);
    }
    DFS(1,0);
    RMQ();
    for(int i=1;i<=m;i++)
    {
        int x,y;
        fin>>x>>y;
        fout<<LCA(x,y)<<"\n";
    }
    return 0;
}