Cod sursa(job #2073060)

Utilizator ScarymovieMocanu Alexandru Scarymovie Data 22 noiembrie 2017 17:53:42
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
vector<int> first,pe;
vector<vector<int> >la;
int RMQ[100005][20];
void dfs(int nod)
{
    first[nod]=pe.size();
    pe.push_back(nod);unsigned int i;
    for(i=0;i<la[nod].size();++i)
        {
            dfs(la[nod][i]);
            pe.push_back(nod);
        }
}
void ConstruiesteRMQ()
{
    unsigned int putere=2,exp=1;unsigned int i;
    for(i=0;i<pe.size();++i) RMQ[i][0]=pe[i];
    while(putere<=pe.size())
    {
        for(i=0;i+putere-1<pe.size();++i) RMQ[i][exp]=min(RMQ[i][exp-1],RMQ[i+putere/2][exp-1]);
        putere<<=1;exp++;
    }
}
int rmq(int st,int dr)
{
    if(st>dr) st^=dr^=st^=dr;
    int lungime=dr-st+1;
    int lg=1,exp=0;
    while(lg<=lungime) lg<<=1,++exp;
    lg>>=1,--exp;
    return min(RMQ[st][exp],RMQ[st+lungime-lg][exp]);
}
int main()
{
    ifstream f("lca.in");
    ofstream g("lca.out");
    int n,m,i,x,y;
    f>>n>>m;la.resize(n);
    for(i=1;i<n;++i) {f>>x;la[x-1].push_back(i);}
    first.resize(n);
    dfs(0);
    la.clear();
    ConstruiesteRMQ();
    for(i=0;i<m;++i)
        {
            f>>x>>y;x--;y--;
            int result=rmq(first[x],first[y])+1;
            g<<result<<'\n';
        }
    return 0;
}