Cod sursa(job #707728)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 5 martie 2012 22:41:45
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#include <vector>
#define MAXN 100010
#define MAXK 1000010
using namespace std;
int log[MAXK],First[MAXN],k,rmq[MAXK][20],l[MAXK],euler[MAXK],n,m;
vector<int>v[100010];
void dfs(int x,int lev)
{
    l[++k]=lev;
    euler[k]=x;
    First[x]=k;
    for(int i=0;i<v[x].size();i++)
    {
        dfs(v[x][i],lev+1);
        l[++k]=lev;
        euler[k]=x;
    }
}
void RMQ()
{
    for(int i=1;i<=k;i++) rmq[i][0]=i;
    for(int j=1;(1<<j)<=k;j++)
        for(int i=1;i<=k and i+(1<<j)<=k;i++)
        if(l[rmq[i][j-1]]<l[rmq[i+(1<<(j-1))][j-1]]) rmq[i][j]=rmq[i][j-1]; else rmq[i][j]=rmq[i+(1<<(j-1))][j-1];
}
int main()
{
    int i,x,y,u,w;
    ifstream fi("lca.in");
    ofstream fo("lca.out");
    fi>>n>>m;
    for(i=1;i<n;i++)
    {
        fi>>x;
        v[x].push_back(i+1);
    }
    dfs(1,1);
    for(i=2;i<=k;i++) log[i]=log[i/2]+1;
    RMQ();
    for(i=1;i<=m;i++)
    {
        fi>>u>>w;
        x=First[u]; y=First[w];
        if(x>y) swap(x,y);
        int dif=y-x+1;
        int L=log[dif];
        if(l[rmq[x][L]]<l[rmq[y-(1<<L)+1][L]]) fo<<euler[rmq[x][L]]<<"\n"; else
        fo<<euler[rmq[y-(1<<L)+1][L]]<<"\n";
    }
    return 0;
}