Cod sursa(job #2030370)

Utilizator AlisRinja Alis Alis Data 1 octombrie 2017 15:32:14
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include<bits/stdc++.h>
using namespace std;
const int nmax=1e6+2;
pair<int,int> visited[nmax]; //indexul o sa fie elementul si valoarea o sa fie nivelul si tatal
vector<int> tr[nmax];
void dfs(int node,int nivel,int tata){
    visited[node]=make_pair(nivel,tata);
    int tataCurent=node;
    int nivelCurent=nivel+1;
    for(int i=0;i<tr[node].size();i++){
        int nodeCurent=tr[node][i];
        dfs(nodeCurent,nivelCurent,tataCurent);
    }
}
int main(){
    ifstream cin("lca.in");
    ofstream fout("lca.out");
    int n,m;
    cin>>n>>m;
    int root=1;
    for(int i=2;i<=n;i++){
        int x;
        cin>>x;
        tr[x].push_back(i);
    }
    dfs(1,1,0);
    int ok=0;
    for(int i=0;i<m;i++){
        int x,y;
        cin>>x>>y;
        int nivelX=visited[x].first;
        int nivelY=visited[y].first;
        if(nivelX<nivelY){
            swap(x,y);
            swap(nivelX,nivelY);
        }
        while(nivelX>nivelY){
            ok=1;
            x=visited[x].second;
            nivelX=visited[x].first;
        }
        if(x==y){
            fout<<x<<"\n";
            continue;
        }
        //sunt pe acelasi nivel
        int tataX=visited[x].second;
        int tataY=visited[y].second;
        while(tataX!=tataY){
            x=tataX;
            y=tataY;
            tataX=visited[x].second;
            tataY=visited[y].second;
        }
        fout<<tataX<<"\n";
    }
    return 0;
}