Cod sursa(job #897361)

Utilizator deividFlorentin Dumitru deivid Data 27 februarie 2013 20:11:43
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include<stdio.h>
#include<vector>
 
#define maxn 100005
#define maxlog 19
#define pb push_back
 
using namespace std;
 
FILE*f=fopen("lca.in","r");
FILE*g=fopen("lca.out","w");
 
int n,q,p;
int rmq[maxlog][maxn<<1],Eul[maxn<<1],Fap[maxn],Niv[maxn<<1],E[maxn<<1];
vector<int>G[maxn];
 
inline void citire () {
     
    fscanf(f,"%d %d",&n,&q);
     
    int t;
    for ( int i = 2 ; i <= n ; ++i ){
        fscanf(f,"%d",&t);
        G[t].pb(i);
    }
}
 
void dfs ( int nod , int niv ){
    Eul[++p] = nod; Niv[p] = niv;
    Fap[nod] = p;
     
    for ( vector<int>::iterator itt = G[nod].begin() ; itt != G[nod].end() ; ++itt ){
        int nodvcn = (*itt);
        dfs(nodvcn,niv+1);
         
        Eul[++p] = nod; Niv[p] = niv;
    }
}
 
inline void Rmq () {
    int i,k;
     
    for ( i = 2 ; i <= p ; ++i ){
        E[i] = E[i>>1] + 1;
    }
     
    for ( i = 1 ; i <= p ; ++i ){
        rmq[0][i] = i;
    }
     
    for ( k = 1 ; k <= E[p] ; ++k ){
        for ( i = 1 ; i + (1<<k) - 1 <= p ; ++i ){
            rmq[k][i] = Niv[rmq[k-1][i]] <= Niv[rmq[k-1][i+(1<<(k-1))]] ? rmq[k-1][i] : rmq[k-1][i+(1<<(k-1))];
        }
    }
}
 
inline void swap ( int &a , int &b ){
    int aux = a ; a = b ; b = aux;
}
 
inline int lca ( int nod1 , int nod2 ){
    if ( Fap[nod1] > Fap[nod2] ){
        swap(nod1,nod2);
    }
    int x = Fap[nod1]; int y = Fap[nod2];
    int e = E[y-x+1];
     
    int poz_lca = Niv[rmq[e][x]] <= Niv[rmq[e][y-(1<<e)+1]] ? rmq[e][x] : rmq[e][y-(1<<e)+1];
    return Eul[poz_lca];
}
 
inline void solve () {
     
    for ( int i = 1 ; i <= q ; ++i ){
        int x,y;
        fscanf(f,"%d %d",&x,&y);
        fprintf(g,"%d\n",lca(x,y));
    }
}
 
int main () {
     
    citire();
    dfs(1,1);
    Rmq();
    solve();
     
    fclose(f);
    fclose(g);
     
    return 0;
}