Cod sursa(job #2280312)

Utilizator herbertoHerbert Mohanu herberto Data 10 noiembrie 2018 13:57:10
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include<bits/stdc++.h>
using namespace std;
#define MAXN 100001
#define MAXP 20

vector <pair<int, int> > sol;
vector<int> g[MAXN];
int first[MAXN];
int d[2][MAXN][MAXP];
int lung;
int lg[200001];

void rmq(){
	int p, i;
	for(p=1; (1<<p)<lung; p++){
    for(i=1; i-1+(1<<p)<=lung; i++){
			if(d[0][i][p-1]<d[0][i+(1<<p-1)][p-1]){
				d[0][i][p]=d[0][i][p-1];
				d[1][i][p]=d[1][i][p-1];
			}
			else{
				d[0][i][p]=d[0][i+(1<<p-1)][p-1];
				d[1][i][p]=d[1][i+(1<<p-1)][p-1];
			}
    }

  }
}

void dfs(int nod, int niv){
	int i;
	sol.push_back({nod, niv});
	if(first[nod]==0)
		first[nod]=sol.size()-1;
	for(i=0; i<g[nod].size(); i++){
		dfs(g[nod][i], niv+1);
		sol.push_back({nod, niv});
		if(first[nod]==0)
			first[nod]=sol.size()-1;
	}
}
int main(){
	FILE*fin=fopen("lca.in", "r");
	FILE*fout=fopen("lca.out", "w");
	int n, m, i, j, a, b, ans;
	fscanf(fin, "%d%d", &n, &m);
	for(i=1; i<=n-1; i++){
		fscanf(fin, "%d", &a);
		g[a].push_back(i+1);
	}
	sol.push_back({0, 0});
	dfs(1, 0);
	lung=sol.size()-1;
	for(i=1; i<=lung; i++){
		printf("%d %d %d\n", i, sol[i].first, sol[i].second);
    d[0][i][0]=sol[i].first;
    d[1][i][0]=i;
	}
	rmq();
	lg[1]=0;
	for(i=2; i<=lung; i++)
		lg[i]=lg[i/2]+1;

  for(m; m>0; m--){
		fscanf(fin, "%d%d", &a, &b);
		i=first[a]; j=first[b];
		printf("%d %d\n", i, j);
		if(d[0][i][lg[j-i]]<d[0][j-(1<<lg[j-i])+1][lg[j-i]])
			ans=d[1][i][lg[j-i]];
		else
			ans=d[1][j-(1<<lg[j-i])+1][lg[j-i]];

		fprintf(fout, "%d\n", ans);
  }
	return 0;
}