Cod sursa(job #3348979)

Utilizator RaduCalisovCalisovRadu RaduCalisov Data 24 martie 2026 21:42:59
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.88 kb
#include <bits/stdc++.h>
using namespace std;

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

int n,q;

vector<int> first;
vector<int> last;
vector<pair<int,int>> euler;
vector<vector<int>> v;

void dfs(int nod,int p,int depth){
    euler.push_back({depth,nod});
    first[nod] = min(first[nod],(int)euler.size()-1);

    for(int i=0;i<v[nod].size();i++){
        int newnod = v[nod][i];

        if(newnod == p)
            continue;

        dfs(newnod,nod,depth+1);

        euler.push_back({depth,nod});
        last[nod] = euler.size() - 1;
    }
}

int main(){
    fin>>n>>q;
    v.resize(n+1);
    first.resize(n+1,1e9);
    last.resize(n+1);

    for(int i=2;i<=n;i++){
        int pi;
        fin>>pi;
        v[i].push_back(pi);
        v[pi].push_back(i);
    }

    dfs(1,0,0);

    int E = euler.size()-1;

    vector<int> lg(E+1);

    lg[1] = 0;

    for(int i=2;i<=E;i++)
        lg[i] = lg[i/2] + 1;

    vector<vector<pair<int,int>>> rmq(E+1,vector<pair<int,int>>(lg[E]+1));

    for(int i=0;i<=E;i++)
        rmq[i][0] = euler[i];

    for(int i=1;i<=lg[E];i++){
        int p2 = 1<<i;
        for(int j = 0;j + p2 <= E ;j++){
            pair<int,int> frmq = rmq[j][i-1];
            pair<int,int> srmq = rmq[j+(1<<(i-1))][i-1];

            if(frmq.first < srmq.first)
                rmq[j][i] = frmq;
            else
                rmq[j][i] = srmq;
        }
    }

    for(int i=1;i<=q;i++){
        int x,y;
        fin>>x>>y;

        if(first[x] > first[y])
            swap(x,y);

        int l = first[x];
        int r = first[y];

        int d = r - l + 1;

        pair<int,int> frmq = rmq[l][lg[d]];
        pair<int,int> srmq = rmq[r - (1<<lg[d]) + 1][lg[d]];

        if(frmq.first < srmq.first)
            fout<<frmq.second<<"\n";
        else
            fout<<srmq.second<<"\n";
    }
}