Cod sursa(job #969392)

Utilizator mitrutstrutMitrea Andrei Ionut mitrutstrut Data 4 iulie 2013 12:09:55
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
#include <bitset>
#include <queue>
#include <deque>
#include <list>
#include <set>
#include <ctime>
#include <string>
#include <cstring>
#include <iomanip>
#include <algorithm>
using namespace std;
ifstream ff("lca.in");
ofstream gg("lca.out");
 
#define max 100001
vector<int> vv[max];
int n, m, cc[2*max], nv[2*max], pp[max], rr[2*max][18], k;
bool ww[max];
  
void dfs(int a,int j){
    int l=vv[a].size(), b;
    ww[a]=1;
    cc[++k]=a;
    nv[k]=j;
    for(int i=0;i<l;i++){
        b=vv[a][i];
        if(!ww[b])dfs(b,j+1);
        cc[++k]=a;
        nv[k]=j;
    }
}
  
void rmq(){
    for(int i=1;i<=k;i++) rr[i][0]=i;
    for(int j=1;(1<<j)<=k;j++)
    for(int i=1;i+(1<<j)-1<=k;i++)
        if(nv[rr[i][j-1]]<nv[rr[i+(1<<(j-1))][j-1]])
            rr[i][j]=rr[i][j-1]; else
            rr[i][j]=rr[i+(1<<(j-1))][j-1];
  
}
  
int main(){
    int a, b, c;
    ff >> n >> m;
    for(int i=2;i<=n;i++){
        ff >> a;
        vv[a].push_back(i);
    }
    dfs(1,0);
    for(int i=1;i<=k;i++)
    if(!pp[cc[i]])pp[cc[i]]=i;
    rmq();
    for(int i=1;i<=m;i++){
        ff >> a >> b;
        a=pp[a]; b=pp[b]; if(a>b)swap(a,b);
        c=log(b-a+1)/log(2);
        if(nv[rr[a][c]]<nv[rr[b-(1<<c)+1][c]])gg << cc[rr[a][c]] << "\n"; else
            gg << cc[rr[b-(1<<c)+1][c]] << "\n";
    }
}