Cod sursa(job #2883188)

Utilizator Vali_nnnValentin Nimigean Vali_nnn Data 1 aprilie 2022 11:47:37
Problema Lowest Common Ancestor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.98 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][1000001],a[100001],nr,b[100001],first[100001],diff,l,sh,x,y,k,lgt,lg[1000001];

vector <int> v[1000001];
void dfs(int k,int lvl)
{
    nr++;
    b[nr]=k;
    first[k]=nr;
    for(int i=0;i<v[k].size();i++)
    {
        dfs(v[k][i],lvl+1);
        nr++;
        a[nr]=lvl;
        b[nr]=k;

    }
}

int main()
{
f>>n>>m;

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


dfs(1,0);
for(i=1;i<=nr;i++)
 rmq[0][i]=b[i];

    lg[1]=0;


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




for (i=1;(1<<i)<=nr;i++)
    for (j=1;j+(1<<i)-1<=nr;j++)
rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);



	for (i=1;i<=m;i++)
	{

		f>>x>>y;
x=first[x];
y=first[y];
if(x>y)
    swap(x,y);
    diff=y-x+1;
		l=lg[diff];

	g<<min(rmq[l][x],rmq[l][y-(1<<l)+1])<<'\n';




	}
    return 0;
}