Pagini recente » Cod sursa (job #1912561) | Cod sursa (job #1940505) | Cod sursa (job #2566496) | Cod sursa (job #693401) | Cod sursa (job #2497103)
#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);
}