Cod sursa(job #1054077)

Utilizator mazaandreiAndrei Mazareanu mazaandrei Data 13 decembrie 2013 12:54:49
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include<fstream>
#include<vector>
using namespace std;
ifstream in("lca.in"); ofstream out("lca.out");
int t[10005],n,nr;
int p[30005], niv[300005];
int poz[10005],m,a,b;
vector <int> l[100005];
void dfs(int nod, int lev){
    niv[++nr]=lev;
    p[nr] =nod;
    if(poz[nod]==0) poz[nod]=nr;
    for(vector <int> :: iterator it=l[nod].begin();it!=l[nod].end();++it)
        if(poz[(*it)]==0 && (*it)!=1){
            dfs((*it),lev+1);
            niv[++nr]=lev;
            p[ nr]=nod;
        }
}
int minim(int st, int dr){
    int nivret=(1<<20), nodret=0;
    for(int i=st; i<=dr;++i)
        if(nivret>niv[i])
            nivret=niv[i],nodret=p[i];
    return nodret;
}
int main(){
    in>>n>>m;
    for(int i=2;i<=n;++i){
        in>>t[i];
        l[t[i]].push_back(i);
    }
    dfs(1,0);
    for(;m;--m){
        in>>a>>b;
        out<<minim(min(poz[a],poz[b]),max(poz[a],poz[b]))<<'\n';
    }
    out.close();
    return 0;
}