Cod sursa(job #2478255)

Utilizator Chirac_MateiChiriac Matei Chirac_Matei Data 21 octombrie 2019 20:07:40
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
int j,m,n,i,x,y;
int dp[20][200005];
long long pow;
vector <int> e;
struct snod
{
    int par;
    vector <int> cop;
} nod[100005];
void euler(int poz)
{
    e.push_back(poz);
    for(auto c : nod[poz].cop)
    {
        euler(c);
        e.push_back(poz);
    }
}
int qu(int x, int y)
{
    int pow=1,i=1;
    while(pow*2<=y-x+1)
    {
        i++;
        pow*=2;
    }
    if(pow==y-x+1)
        return dp[i][x];
    return min(dp[i][x], dp[i][y-pow+1]);
}
int main()
{
    fin>>n>>m;
    for(i=2; i<=n; i++)
    {
        fin>>x;
        nod[i].par=x;
        nod[x].cop.push_back(i);
    }
    euler(1);
    n=e.size()-1;
    pow=1;
    for(i=1;pow<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            if(i==1)
                dp[i][j]=e[j];
            else
            {
                if(j+pow/2<=n)
                    dp[i][j]=min(dp[i-1][j],dp[i-1][j+pow/2]);
                else
                    dp[i][j]=dp[i-1][j];
            }
        }
        pow*=2;
    }
    while(m)
    {
        fin>>x>>y;
        for(i=0;i<=n;i++)
            if(e[i]==x)
                break;
        for(j=0;j<=n;j++)
            if(e[j]==y)
                break;
        fout<<qu(i,j)<<'\n';
        m--;
    }
    return 0;
}