Cod sursa(job #1714849)

Utilizator bleo16783FMI Bleotiu Cristian bleo16783 Data 9 iunie 2016 16:24:08
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
#include<fstream>
#include<vector>
using namespace std;
int x[100001],i,j,k,l,n,m,e[250002],nv[100001],N,o,p,O,first[100001];
int A,B;
int D[20][250001];
vector<int> a[100001];
void euler(int i)
{
    k++;e[k]=i;if(!first[i])first[i]=k;
    if(x[i]>0)
    {
        for(int j10=0;j10<x[i];++j10)
        {
            euler(a[i][j10]);
            k++;
            e[k]=i;
            //cout<<a[i][j]<<" ";
        }
    }
}
int mn(int a,int b)
{
    if(a>b)return b;
    return a;
}
inline int log2(int a)
{
    if(a==0)return 0;
    if(a==1)return 0;
    int k10;
    for(k10=0;(1<<k10)<a;++k10);
    if((1<<k10)>a)--k10;
    return k10;
}
int main()
{
    ifstream f("lca.in");
    f>>n>>m;nv[1]=1;
    for(i=1;i<n;++i)
    {
        f>>l;nv[i+1]=nv[l]+1;
        a[l].push_back(i+1);
        ++x[l];
    }
    k=0;
    euler(1);
    N=log2(k)+1;k++;
    for(i=1;i<k;++i)D[0][i]=i;
    for(i=1;i<N;++i)
    {
        for(j=1;j<k;++j)
        {
            if(nv[e[D[i-1][j]]]<nv[e[D[i-1][j+(1<<(i-1))]]])
                D[i][j]=D[i-1][j];
            else
                D[i][j]=D[i-1][j+(1<<(i-1))];
        }
    }
    //for(i=1;i<k;i++)cout<<e[i]<<" ";cout<<'\n';
    //for(i=1;i<k;i++)cout<<nv[e[i]]<<" ";cout<<'\n';
    ofstream g("lca.out");
    for(l=0;l<m;++l)
    {
        f>>o>>p;
        A=first[o];B=first[p];
        if(A>B)swap(A,B);
        o=log2(B-A);
        if(nv[e[D[o][A]]]>nv[e[D[o][B-(1<<o)+1]]])
            g<<e[D[o][B-(1<<o)+1]]<<'\n';
        else
            g<<e[D[o][A]]<<'\n';
    }
    f.close();
    g.close();
    return 0;
}