Cod sursa(job #3003339)

Utilizator velciu_ilincavelciu ilinca velciu_ilinca Data 15 martie 2023 17:52:58
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.03 kb
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int N = 1e5;
int dp[18][2*N+1],nivel[N+1],poz[N+1];
vector<int>g[N+1];
vector<int>v;
int lvl=1;
int noduri;
int var=0;
void dfs(int node,int lvl)
{
    v.push_back(node);
    var++;
    poz[node]=var;
    nivel[node]=lvl;
    lvl++;
    for(int i=0;i<g[node].size();i++)
    {
        if(nivel[g[node][i]]==0)
        {
            dfs(g[node][i],lvl);
            var++;
        }
        v.push_back(node);
        poz[node]=var;
    }
}
void build_rmq()
{
    for(int i=0;i<v.size();i++)
        dp[0][i]=v[i];
    int l=log2(v.size());
    int l2=v.size();
    for(int i=1;i<=l;i++)
        for(int j=1;j<=l2;j++)
        {
            if(nivel[dp[i-1][j]]<nivel[dp[i-1][j+(1<<(i-1))]])
                dp[i][j]=dp[i-1][j];
            else
                dp[i][j]=dp[i-1][j+(1<<(i-1))];
        }
}
int lastappearencex=0,lastappearencey=0;
void findancestor(int x,int y)
{
    int lastx=poz[x]-1;
    int lasty=poz[y]-1;
    if(lastx>lasty)
        swap(lastx,lasty);
    int length=lasty-lastx+1;
    int exp=log2(length);
    int lint1=(1<<exp);
    int cmp=dp[exp][lastx];
    int cmp2=dp[exp][lasty-lint1+1];
    int finali=1e9;
    if (nivel[cmp]<finali)
    {
        finali=cmp;
    }
    if(nivel[cmp2]<nivel[finali])
        finali=cmp2;
    out<<finali<<'\n';
}
int main()
{
    int perechi;
    in>>noduri>>perechi;
    for(int i=2;i<=noduri;i++)
    {
        int node;
        in>>node;
        g[node].push_back(i);

    }
    dfs(1,1);
    build_rmq();
    /*for(int i=1;i<=noduri;i++)
        out<<poz[i]<<' ';
    out<<'\n';
    for(int i=0;i<v.size();i++)
    {
        out<<v[i]<<' ';
    }

    out<<'\n';
     for(int i=0;i<v.size();i++)
    {
        out<<nivel[v[i]]<<' ';
    }
    out<<'\n';*/
    for(int i=1;i<=perechi;i++)
    {
        int x,y;
        in>>x>>y;
        findancestor(x,y);
    }
    return 0;
}