Cod sursa(job #3354765)

Utilizator RaduCalisovCalisovRadu RaduCalisov Data 20 mai 2026 12:15:33
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.85 kb
#include<bits/stdc++.h>
using namespace std;

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

vector<int> euler;
vector<int> first;
vector<int> depth;
vector<int> LOG;
vector<vector<int>> v;
vector<vector<pair<int,int>>> rmq;

void dfs(int nod,int p){

    first[nod] = euler.size();
    euler.push_back(nod);

    for(int i = 0 ; i < v[nod].size();i++){
        int newnod = v[nod][i];
        if(p != newnod){
            depth[newnod] = depth[nod] + 1;

            dfs(newnod,nod);
            euler.push_back(nod);
        }
    }
}

int main()
{
    int n,q;
    fin>>n>>q;

    v.resize(n+1);
    depth.resize(n+1);
    first.resize(n+1);

    depth[1] = depth[0] = 0;

    for(int i=2;i<=n;i++){
        int x;
        fin>>x;

        v[i].push_back(x);
        v[x].push_back(i);
    }

    dfs(1,0);

    int N = euler.size()-1;

    LOG.resize(N+1);
    LOG[1] = 0;

    for(int i = 2 ; i <= N;i++)
        LOG[i] = LOG[i/2]+1;

    rmq.resize(N+1,vector<pair<int,int>>(LOG[N]+1));

    for(int i = 0;i<=N;i++)
        rmq[i][0] = {euler[i],depth[euler[i]]};

    for(int j = 1;j<=LOG[N];j++){
        for(int i = 0;i+(1<<j)-1<=N;i++){
            if(rmq[i][j-1].second < rmq[i+(1<<(j-1))][j-1].second)
                rmq[i][j] = rmq[i][j-1];
            else
                rmq[i][j] = rmq[i+(1<<(j-1))][j-1];
        }
    }

    for(int i = 1;i<=q;i++){
        int a,b;
        fin>>a>>b;

        if(first[a] > first[b])
            swap(a,b);
        int posa = first[a];
        int posb = first[b];
        int bestlog = LOG[posb-posa+1];

        pair<int,int> fir = rmq[posa][bestlog];
        pair<int,int> sec = rmq[posb-(1<<bestlog)+1][bestlog];

        if(fir.second < sec.second)
            fout<<fir.first<<"\n";
        else
            fout<<sec.first<<"\n";
    }
}