Cod sursa(job #2776291)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 19 septembrie 2021 10:59:47
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.87 kb
#include<fstream>
#include<vector>
#define N 100005
using namespace std;
ifstream F("lca.in");
ofstream G("lca.out");
vector<int> g[N];
int k,n,m,l[N<<1],h[N<<1],t[N<<1],f[N],r[20][N<<2],i,j,a,b,s,d,z,u;
void D(int d,int v)
{
    int i,j=g[d].size();
	h[++k]=d,l[k]=v,f[d]=k;
	for(i=0;i<j;++i)
		D(g[d][i],v+1),h[++k]=d,l[k]=v;
}
int main()
{
	F>>n>>m;
	for(i=2;i<=n;++i)
        F>>j,g[j].push_back(i);
	D(1,0);
    for(i=2;i<=k;++i)
		t[i]=t[i>>1]+1;
	for(i=1;i<=k;++i)
		r[0][i]=i;
	for(i=1;(1<<i)<k;++i)
		for(j=1;j<=k-(1<<i);++j) {
			s=1<<(i-1),r[i][j]=r[i-1][j];
			if(l[r[i-1][j+s]]<l[r[i][j]])
				r[i][j]=r[i-1][j+s];
		}
	while(m--) {
		F>>i>>j,a=f[i],b=f[j];
        if(a>b)
            s=a,a=b,b=s;
        d=b-a+1,u=t[d],s=r[u][a],z=d-(1<<u);
        if(l[s]>l[r[u][a+z]])
            s=r[u][a+z];
        G<<h[s]<<"\n";
	}
	return 0;
}