Cod sursa(job #3235770)

Utilizator Dragos__1_1Dragos Antohi Dragos__1_1 Data 21 iunie 2024 13:41:14
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.03 kb
/******************************************************************************

                              Online C++ Compiler.
               Code, Compile, Run and Debug C++ program online.
Write your code in this editor and press "Run" button to compile and execute it.

*******************************************************************************/

#include <bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int euler[200006],m,n,i,j,x,encode[100006],rencode[100006],nr,siz,fc[100006],a,b;
vector<int>fii[100006];
queue<int>Q;
int rmq[17][200006];
int LOG[100006];
void bfs()
{   Q.push(1);
    int y,i;
    while (!Q.empty())
    {   y=Q.front();
        Q.pop();
        for(i=0;i<fii[y].size();i++)
        {   nr++;
            encode[fii[y][i]]=nr;
            rencode[nr]=fii[y][i];
            Q.push(fii[y][i]);
        }
    }
}
void dfs(int nod)
{   euler[++siz]=encode[nod];
    if(fc[encode[nod]]==0)fc[encode[nod]]=siz;
    for(int i=0;i<fii[nod].size();i++)
    {   dfs(fii[nod][i]);
        euler[++siz]=encode[nod];
    }
}
int main()
{
    f>>n>>m;
    for (i=1;i<n;i++)
    {   f>>x;
        fii[x].push_back(i+1);
    }
    nr++;
    encode[1]=nr;
    rencode[1]=1;
    bfs();
    dfs(1);
    for (i=2;i<=siz;i++)LOG[i]=LOG[i/2]+1;
    //for (i=1;i<=n;i++)cout<<fc[encode[i]]<<' '<<i<<'\n';
    //for (i=1;i<=siz;i++)cout<<euler[i]<<' ';
    //cout<<endl;
    //for (i=1;i<=n;i++)cout<<i<<' '<<fc[encode[i]]<<'\n';
    for (i=1;i<=siz;i++)rmq[0][i]=euler[i];
    //cout<<siz<<' '<<LOG[siz]<<'\n';
    for (i=1;i<=LOG[siz];i++)
    {   for (j=1;j<=siz;j++)
        {   if (j+(1<<i)>siz||rmq[i-1][j+(1<<(i-1))]==0)break;
            rmq[i][j]=min( rmq[i-1][j],rmq[i-1][j+(1<<(i-1))] );
        }
    }
    while (m--)
    {   f>>a>>b;
        if (fc[encode[b]]<fc[encode[a]])swap(b,a);
        a=fc[encode[a]];
        b=fc[encode[b]];
        g<<rencode[  min(rmq[LOG[b-a+1]][a],rmq[LOG[b-a+1]][b+1-(1<<LOG[b-a+1])])  ]<<'\n';
    }
    return 0;
}