Cod sursa(job #2409136)

Utilizator AlexandruBrezuleanuAlexandruBrezuleanu AlexandruBrezuleanu Data 18 aprilie 2019 18:19:26
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <bits/stdc++.h>
#define MAX 100100
#define LOGMAX 20
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector <int>g[MAX];
bool uz[MAX];
int c[2*MAX][LOGMAX];
int level[2*MAX];
int euler[2*MAX];
int ind[MAX];
int n,m,nr=1,lg=1;
void repeuler(int node);
void read();
void process();
void query();
int main()
{
    int i;
    read();
    process();
    query();
    return 0;
}
void read()
{
    int i,x;
    fin>>n>>m;
    for(i=2;i<=n;i++)
    {
        fin>>x;
        g[x].push_back(i);
        g[i].push_back(x);
    }
    repeuler(1);
}
void repeuler(int node)
{
    int i;
    uz[node]=1;
    euler[nr]=node;
    level[nr]=lg;
    if(!ind[node])
        ind[node]=nr;
    nr++;
    for(i=0;i<g[node].size();i++)
        if(!uz[g[node][i]])
    {
        lg++;
        repeuler(g[node][i]);
        lg--;
        euler[nr]=node;
        level[nr]=lg;
        nr++;
    }
}
void process()
{
    int i,j;
    for(i=1;i<=2*n-1;i++)
        c[i][0]=i;
    for(j=1;(1<<j)<=2*n-1;j++)
        for(i=1;i+(1<<j)-1<=2*n-1;i++)
        if(level[c[i][j-1]]<level[c[i+(1<<j-1)][j-1]])
        c[i][j]=c[i][j-1];
        else
            c[i][j]=c[i+(1<<j-1)][j-1];
}
void query()
{
    int i,k,x,y;
    for(i=1;i<=m;i++)
    {
        fin>>x>>y;
        x=ind[x];y=ind[y];
        if(x>y)
            swap(x,y);
        k=log2(y-x+1);
        if(level[c[x][k]]<level[c[y-(1<<k)+1][k]])
            fout<<euler[c[x][k]]<<'\n';
        else
            fout<<euler[c[y-(1<<k)+1][k]]<<'\n';
    }
}