Cod sursa(job #767557)

Utilizator memaxMaxim Smith memax Data 13 iulie 2012 19:54:39
Problema Lowest Common Ancestor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;

vector<int> e,u(2,0),h(2,0),f(2,0);
vector< vector<int> > t(2);

int min(int a, int b){
    if(a>100000) return(b);
    if(b>100000) return(a);
    if(h[a]>h[b]){ return(b); }
    else         { return(a); }
    }

void dfs(int v);

int main(){
    int n,m,q;
    ifstream cinr ("lca.in");
    ofstream cour ("lca.out");
    cinr >> n; cinr >> m;
    for(int i=2; i<=n; i++){
            t.push_back(e);
            u.push_back(0);
            h.push_back(0);
            f.push_back(0);
            cinr >> q;
            t[q].push_back(i);
            }
    dfs(1);
    int k=1<<int(log(e.size()-1)/log(2)+1);
    vector<int> w(2*k, 200000);
    for(int i=0; i<e.size(); i++) w[k+i]=e[i];
    for(int i=k-1; i>0; i--) w[i]=min(w[2*i], w[2*i+1]);
    int l,r;
for(int i=1; i<=m; i++){
    cinr >> l; cinr >> r;
    l=f[l]+k-1; 
    r=f[r]+k-1;
    if(l>r){
            int y=l;
            l=r; r=y;
            }
    int mn=300000;
    while(l<=r){
               if(l%2==1) mn=min(mn, w[l]); 
               if(r%2==0) mn=min(mn, w[r]); 
               l=(l+1)/2; r=(r-1)/2;
               }
    cour << mn << "\n";
}
    cinr.close();
    cour.close();
    //cin.ignore(2);
    return 0;
    }
    
void dfs(int v){
     e.push_back(v);
     f[v]=e.size();
     u[v]=1;
     for(int i=0; i<t[v].size(); i++){
             if(u[t[v][i]]==0){
                               h[t[v][i]]=h[v]+1;
                               dfs(t[v][i]);
                               }
             e.push_back(v);
             }
     }