Cod sursa(job #1991999)

Utilizator tifui.alexandruTifui Ioan Alexandru tifui.alexandru Data 18 iunie 2017 23:53:36
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
//BULANEALA
#include <bits/stdc++.h>
#define Nmax 100001
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
list <int> arb[Nmax];
int elr[2*Nmax];
int lvl[Nmax];
int pz[Nmax];
int N;
void DFS(int x, int lv)
{
    elr[++N]=x;
    lvl[x]=lv;
    if(!pz[x]) pz[x]=N;
    for(list <int> :: iterator it=arb[x].begin();it!=arb[x].end();it++)
    {
        DFS(*it,lv+1);
        elr[++N]=x;
    }
}
int main()
{
    int n,m,i,x,y,j,p,q;
    f>>n>>m;
    for(i=2;i<=n;i++)
    {
        f>>x;
        arb[x].push_back(i);
    }
    DFS(1,0);
    for(j=1;j<=m;j++)
    {
        f>>x>>y;
        p=pz[x];
        q=pz[y];
        if(q<p) swap(p,q);
        int minn=2e9,poz;
        for(i=p;i<=q;i++)
            if(lvl[elr[i]]<minn)
            {
                minn=lvl[elr[i]];
                poz=elr[i];
            }
        g<<poz<<'\n';
    }

    return 0;
}