Cod sursa(job #3328420)

Utilizator bagae123Burlacu Andrei bagae123 Data 8 decembrie 2025 16:24:44
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <fstream>
#include<bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int N_MAX=1e5;
int depth[N_MAX+5];
const int PMAX=18;
int v[N_MAX+5];
int e[N_MAX+5];
int start[N_MAX+5];
vector<int>tree[N_MAX+5];
vector<int>euler;
int nr=0;
pair<int,int>r[PMAX][2*N_MAX+5];
void dfs(int nod)
{



    euler.push_back(nod);
     nr=euler.size();
     start[nod]=nr;
    r[0][nr].first=nod;
    r[0][nr].second=depth[nod];
    for(auto x:tree[nod])
    {
        depth[x]=depth[nod]+1;
        dfs(x);
        euler.push_back(nod);
    nr=euler.size();
    r[0][nr].first=nod;
    r[0][nr].second=depth[nod];
    }
}

int main()
{
    int n,q,x,y;
    fin>>n>>q;
    for(int i=2; i<=n; i++)
    {
        fin>>x;
        tree[x].push_back(i);
    }



    dfs(1);
    e[1]=0;
    n=2*n-1;
    for(int i=2;i<=n;i++)
    {
        e[i]=e[i/2]+1;
    }
    for(int p=1;(1<<p)<=n;p++)
    {
        for(int i=1;i<=n;i++)
        {
            r[p][i]=r[p-1][i];

            int j=i+(1<<(p-1));
            if(j<=n&&r[p][i].second>r[p-1][j].second)
            {
                r[p][i]=r[p-1][j];
            }

        }
    }
while(q--)
{
    fin>>x>>y;
    if(start[x]<start[y]){
    int E=e[start[y]-start[x]+1];
    int len=(1<<E);
    if(r[E][start[x]].second<r[E][start[y]-len+1].second)
    {
        fout<<r[E][start[x]].first<<"\n";
    }
    else fout<<r[E][start[y]-len+1].first<<"\n";


    }
    else

    {
        int E=e[start[x]-start[y]+1];
        int len=(1<<E);
        if(r[E][start[y]].second<r[E][start[x]-len+1].second)
    {
        fout<<r[E][start[y]].first<<"\n";
    }
    else fout<<r[E][start[x]-len+1].first<<"\n";

    }

}
    return 0;
}