Cod sursa(job #2121128)

Utilizator lorena1999Marginean Lorena lorena1999 Data 3 februarie 2018 12:35:21
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#include <queue>
#define MAX 100001

using namespace std;

int n, m, T[MAX], deep[MAX];

vector < int > v[MAX];

queue < int > q;

bitset < MAX > viz;

ifstream f("lca.in");
ofstream g("lca.out");



void dfs()
    {
        q.push(1);
        while(!q.empty())
        {
            int node = q.front();
            q.pop();
            if(viz[node]==0)
            {
                viz[node]=1;
                for(size_t i=0; i<v[node].size(); i++)
                    {
                        deep[v[node][i]]=deep[node]+1;
                        q.push(v[node][i]);
                    }
            }
        }

    }

int lca(int n1, int n2)
    {
        while(deep[n1]>deep[n2])
            n1=T[n1];
        while(deep[n2]>deep[n1])
            n2=T[n2];
        while(deep[n2]==deep[n1] && n1!=n2)
        {
            n2=T[n2];
            n1=T[n1];
        }
        return n1;
    }

void read()
    {
        f>>n>>m;
        for(int i=2; i<=n; i++)
        {
            f>>T[i];
            v[T[i]].push_back(i);
           // v[i].push_back(T[i]);
        }

        deep[1]=1;
        dfs();
        /*for(int i=1; i<=n; i++)
            cout<<deep[i]<<" ";
        cout<<endl;*/
        int x, y;

        for(int i=1; i<=m; i++)
        {
            f>>x>>y;
            g<<lca(x, y)<<'\n';
        }

    }

int main()
    {
        read();

    }