Cod sursa(job #2497103)

Utilizator lucian2015blaugranadevil lucian2015 Data 22 noiembrie 2019 03:45:52
Problema Lowest Common Ancestor Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <stdlib.h>
#define hmax 200

using namespace std;

ifstream f("lca.in");
ofstream g("lca.out");



class lcaSqrt{
private:
	vector<vector<int> > graph;
	vector<int> nivel;
	vector<int> parentjump;
	vector<int> parent;
public:
	lcaSqrt(vector<vector<int> > mygraph){
		graph = mygraph;
		nivel.resize(graph.size(),0);
		parentjump.resize(graph.size(),0);
		parent.resize(graph.size(),0);
	}
   void display(){
   	 int i,  j;
  		for( int i = 1; i < graph.size(); i++ ){
	 		for ( int j = 0; j < graph[i].size(); j++ ){
				g << graph[i][j] <<" ";
     			}
			g<<"\n";
   		}
 	}
 	void dfs(int nod, int prev, int n1, int level){
 		nivel[nod] = level;
 		parent[nod] = prev;
 		parentjump[nod] = n1; 
 		if( level % hmax == 0 )
 			n1 = nod;
 		for( int i = 0; i < graph[nod].size(); i++ ){
 			dfs( graph[nod][i], nod, n1, level + 1);
 		}
 	  
 	}
 	int result (int x, int y){
 	while(parentjump[x] != parentjump[y])
		if(nivel[x] > nivel[y])
			x = parentjump[x];
		else
			y = parentjump[y];
	while(x != y)
		if(nivel[x] > nivel[y])
			x = parent[x];
		else
			y = parent[y];
	return x;

 	}
   void getlca(vector< pair<int,int> >& queries){
   	dfs(1,0,0,0);
   	for ( auto it : queries){
        g << result(it.first, it.second) <<"\n";
   	}
   }

};


void lca( vector<vector<int> >& graph, vector< pair<int,int> >& queries ){
	lcaSqrt mylca(graph);
	mylca.getlca(queries);
}

int main(){
int x, nod, y, n, m;
vector< pair< int, int > > queries;
f >> n >> m;
vector<int> parents(n + 1, 0);
vector< vector < int> > graph(n + 1);
for( int i = 2; i <=  n; i++){
	f >> parents[i];
  graph[parents[i]].push_back(i);
}
for( int i = 1; i <= m; i++ ){
	f >> x >> y;
	queries.push_back({x,y});
 }
 lca(graph,queries);

}