Cod sursa(job #2225275)

Utilizator ctlin04UAIC.VlasCatalin ctlin04 Data 26 iulie 2018 15:16:50
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<fstream>
#include<vector>
using namespace std;

int n, m, f[100005], log[200005];
vector<int> g[100005], euler, lev;
int **rmq;

void dfs(int nod, int l) {
   euler.push_back(nod);
   lev.push_back(l);
   f[nod]=euler.size()-1;
   
   for (int i=0; i<g[nod].size(); ++i) {
     dfs(g[nod][i],l+1);   
     euler.push_back(nod);
     lev.push_back(l);
   }
	
}

int main(void) {
	ifstream cin("lca.in");
	ofstream cout("lca.out");
	
	log[1]=0;
	for (int i=2; i<=200001; ++i) log[i]=log[i/2]+1;
	
	cin>>n>>m;
	for (int i=2; i<=n; ++i) {
	  int x;
	  cin>>x;
	  g[x].push_back(i);	
	}
	
	dfs(1,1);
	
	int vs = euler.size();
	
	rmq = new int*[log[vs]+1];
	for (int i=0; i<=log[vs]; ++i) rmq[i]=new int[vs];
	for (int i=0; i<vs; ++i) rmq[0][i]=i;
	
	for (int i=1; i<=log[vs]; ++i)
	 for (int j=0; j<=vs-(1<<i); ++j)
	  if (lev[rmq[i-1][j]]<lev[rmq[i-1][j+(1<<(i-1))]]) rmq[i][j]=rmq[i-1][j];
	  else rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
	
	for (int i=1; i<=m; ++i) {
	   int x, y; cin>>x>>y;	
	   int l=min(f[x],f[y]);
	   int r=max(f[x],f[y]);	
	   int idx=log[r-l+1];
	   int d = (1<<idx);	
	   	
	   if (lev[rmq[idx][l]]<lev[rmq[idx][r-d+1]]) cout<<euler[rmq[idx][l]]<<"\n";
	   else cout<<euler[rmq[idx][r-d+1]]<<"\n";
	}
	
	
	return 0;
}