Cod sursa(job #3041230)

Utilizator rARES_4Popa Rares rARES_4 Data 31 martie 2023 10:37:26
Problema Lowest Common Ancestor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream f ("lca.in");
ofstream g ("lca.out");
int euler[200004],nivel[200004];
int poz_noduri[100001];
int dp[200005][30];
int n,m,cnt;
vector<int>adiacenta[100001];
void DFS(int nod,int level)
{
    euler[++cnt] = nod;
    nivel[cnt] = level;
    poz_noduri[nod] = cnt;
    for(auto x:adiacenta[nod])
    {
        DFS(x,level+1);
        euler[++cnt] = nod;
        nivel[cnt] = level;
    }
}
int aflare(int x,int y)
{
    int l = y-x+1;
    int put = log2(l);
    if(nivel[dp[x][put]]>nivel[dp[y-(1<<put)+1][put]])
        return dp[y-(1<<l)+1][put];
    return dp[x][put];
}
int main()
{
    f >> n >> m;
    for(int i = 2;i<=n;i++)
    {
        int x;
        f >> x;
        adiacenta[x].push_back(i);
    }
    DFS(1,0);
    for(int i = 1;i<=cnt;i++)
        dp[i][0] = i;
    int l = log2(cnt)+1;
    for(int put = 1;put<=l;put++)
    {
        for(int st = 1;st+(1<<(put-1))-1<=cnt;st++)
        {
            if(nivel[dp[st][put-1]]<nivel[dp[st+(1<<(put-1))][put-1]])
            {
                dp[st][put] = dp[st][put-1];
            }
            else
                dp[st][put] = dp[st+(1<<(put-1))][put-1];
        }
    }
    for(int i = 1;i<=m;i++)
    {
        int x,y;
        f >> x >> y;
        if(poz_noduri[x]>poz_noduri[y])
            swap(x,y);
        g << euler[aflare(poz_noduri[x],poz_noduri[y])]<<'\n';
    }
}