Cod sursa(job #2408379)

Utilizator AlexandruBrezuleanuAlexandruBrezuleanu AlexandruBrezuleanu Data 17 aprilie 2019 21:24:02
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 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 euler[2*MAX];
int level[2*MAX];
int ind[MAX];
int c[2*MAX][LOGMAX];
int n,m,lg,nr=1;
void read();
void repeuler(int node);
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;
    level[nr]=lg;
    euler[nr]=node;
    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--;
            level[nr]=lg;
            euler[nr]=node;
            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';
    }
}