Cod sursa(job #3001908)

Utilizator Vali_nnnValentin Nimigean Vali_nnn Data 14 martie 2023 02:52:06
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb

#include <fstream>
#include<algorithm>
#include<vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
long long n,m,i,j;
long long rmq[20][1000005],lg[1000005],diff,l,sh,x,y,k,p,x1,y1;
long long euler[1000005],first[1000005],h[10001];
 vector <int> v[1000005];
 void dfs(int nod , int nivel)
{
    euler[++k] = nod;
    h[k] = nivel;
    first[nod] = k;

    for ( int i = 0 ; i < v[nod] . size() ; i++)
    {
        dfs(v[nod][i] , nivel + 1);
        euler[++k] = nod;
        h[k] = nivel;
    }
}




int main()
{
f>>n>>m;
for(i=2;i<=n;i++)
    {f>>x;
    v[x].push_back(i);



    }

    dfs(1,0);

    lg[1]=0;
    for(i=1;i<=k;i++)
        rmq[0][i]=i;


for(i=2;i<=k;i++)
    lg[i]=lg[i/2]+1;

for (i=1;(1<<i)<=k;i++)
    for (j=1;j+(1<<i)-1<=k;j++)
    {rmq[i][j] = rmq[i-1][j];
        if(h[rmq[i-1][j + (1<<(i-1))]] < h[rmq[i][j]])
        rmq[i][j]=rmq[i-1][j + (1<<(i-1))];
    }


	for (i=1;i<=m;i++)
	{
		f>>x>>y;
 x1=first[x];
 y1=first[y];
 if(x1>y1)
    swap(x1,y1);

    p=y1-x1+1;
		l=lg[p];

 	g<<euler[min(rmq[l][x1],rmq[l][y1-(1<<l)+1])]<<'\n';
	}
    return 0;
}