Cod sursa(job #3339955)

Utilizator RaduCalisovCalisovRadu RaduCalisov Data 11 februarie 2026 12:01:57
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.98 kb
#include <bits/stdc++.h>

using namespace std;

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

struct types{
    int val;int nod;
};

int n,m;
vector<vector<int>> v;
vector<int> first;
vector<int> euler;
vector<int> depths;
vector<bool> checked;

void ini(int nod,int depth){
    checked[nod] = 1;
    euler.push_back(nod);
    depths.push_back(depth);

    first[nod] = euler.size()-1;

    for(int i=0;i<v[nod].size();i++){
        int newnod = v[nod][i];
        if(checked[newnod] == 0){
            ini(newnod,depth + 1);
            euler.push_back(nod);
            depths.push_back(depth);
        }
    }
}

int main()
{
    fin>>n>>m;
    v.resize(n+1);
    checked.resize(n+1,0);
    first.resize(n+1);

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

    ini(1,0);

    vector<int> log(euler.size()+2);

    log[1] = 0;
    for(int i=2;i<=euler.size();i++)
        log[i] = log[i/2] + 1;

    vector<vector<types>> rmq(euler.size()+1,vector<types>(log[euler.size()]+1));

    for(int i=0;i<euler.size();i++){
        rmq[i][0].val = depths[i];
        rmq[i][0].nod = euler[i];
    }

    for(int j = 1;j<log[euler.size()];j++){

        for(int i=0;i+(1<<j)-1 < euler.size();i++){
            int power = 1<<(j-1);
            if(rmq[i][j-1].val < rmq[i+power][j-1].val)
                rmq[i][j] = rmq[i][j-1];
            else
                rmq[i][j] = rmq[i+power][j-1];

            //fout<<"de la "<<i<<" la "<<i+(1<<j)-1<<" cu depth "<<rmq[i][j].val<<" nodul "<<rmq[i][j].nod<<"\n";
        }
    }

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

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

        int maxlog = log[r-l+1];

        if(rmq[l][maxlog].val < rmq[r-(1<<maxlog)+1][maxlog].val)
            fout<<rmq[l][maxlog].nod<<"\n";
        else
            fout<<rmq[r-(1<<maxlog)+1][maxlog].nod<<"\n";
    }
}