Cod sursa(job #1882292)

Utilizator ionut98Bejenariu Ionut Daniel ionut98 Data 17 februarie 2017 08:24:40
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<fstream>
#include<vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
const int h=200;
int tata[100005],tata2[100005];
int niv[100005],x,y,m,n,i;
vector<int>ls[100005];
void dfs(int nod,int n1,int Niv)//nodul,tatal lui si nivelul :-)
{
    int i;
    tata2[nod]=n1;//retin tatal
    niv[nod]=Niv;//ii retin nivelul in arbore
    if(Niv%h==0)
      n1=nod;
    for(i=0;i<ls[nod].size();i++)//fac aceleasi lucruri pentru toti fii nodului meu
      dfs(ls[nod][i],n1,Niv+1);
}
int main()
{
    f>>n>>m;
    for(i=2;i<=n;i++)
    {
        f>>tata[i];
        ls[tata[i]].push_back(i);//retin muchiile conform vectorului de tati
    }
    dfs(1,1,0);//formez vectorul pentru nivele
    while(m)
    {
        f>>x>>y;//nodurile al caror stramos trebuie sa il afluu
        while(tata2[x]!=tata2[y])//atata vreme cat nu am acelasi tata urc in arbore
          if(niv[x]>niv[y])
            x=tata2[x];
          else
            y=tata2[y];
        while(x!=y)//stramosul comun retinut in x
          if(niv[x]>niv[y])
            x=tata[x];
          else
            y=tata[y];
        g<<x<<"\n";
        m--;
    }
    return 0;
}