Cod sursa(job #2084854)

Utilizator sergiudnyTritean Sergiu sergiudny Data 9 decembrie 2017 12:22:12
Problema Lowest Common Ancestor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <bits/stdc++.h>
#define DM 100005
#define pb push_back
#define pii pair<int,int>
#define x first
#define y second
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");

int n,m,a,b;
vector<int>fiu[DM];
int niv[DM];
int parinte[DM],lastAp[DM];
vector<pii>lin;

void lca(int a,int b){
    bool isA=0,isB=0;
    int bestAnc=(niv[a]<niv[b]?a:b),bestNiv=min(niv[a],niv[b]);
    for(auto i:lin){
        if(isA || isB)
            bestAnc = (i.y<bestNiv?i.x:bestAnc),
            bestNiv = min(bestNiv,i.y);
        if(i.x==a){
            if(!isA) isA=1;
            if(isB){
                fout<<bestAnc<<'\n';
                return;
            }
        }
        else if(i.x==b){
            if(!isB) isB=1;
            if(isA){
                fout<<bestAnc<<'\n';
                return;
            }
        }
    }
}

void dfs(int nod,int level){
    lin.pb({nod,level});
    niv[nod]=level;
    for(auto i:fiu[nod])
        dfs(i,level+1),
        lin.pb({nod,level});
    lin.pb({nod,level});
}

int main()
{
    fin>>n>>m;
    for(int i=2;i<=n;++i){
        fin>>a;
        fiu[a].pb(i);
    }
    dfs(1,1);
    for(auto i:lin){
        //fout<<i.x<<" "<<i.y<<'\n';
    }
    for(int i=1;i<=m;++i){
        fin>>a>>b;
        lca(a,b);
    }
    return 0;
}