Cod sursa(job #1123000)

Utilizator projectanduFMI Stanescu Andrei Alexandru projectandu Data 25 februarie 2014 21:52:49
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <iostream>
#include <fstream>
#include <vector>
#define INF 0x33ffff
#define endl '\n';
using namespace std;

ifstream d("lca.in");
ofstream o("lca.out");
const int N=1+1e6;
const int M=2e6;
vector<int> a[N];
int n,m,b[2][M],p,nr,cmin,y,poz;
bool ok;

void lca(int j)
{
    int q=a[j].size();
    for(int i=0; i<q; i++)
    {
        b[1][++p]=a[j][i];
        nr++;
        b[2][p]=nr;

        lca(a[j][i]);

        b[1][++p]=j;
        nr--;
        b[2][p]=nr;
    }
}

int main()
{
    int i,x;
    d>>n>>m;
    for(i=2; i<=n; i++)
    {
        d>>m;
        a[m].push_back(i);
    }
    b[1][++p]=1;
    b[2][p]=nr;
    lca(1);
    while(d>>x>>y)
    {
        cmin=INF;
        ok=false;
        for(i=1; i<=p; i++)
        {
            if(b[1][i]==x)
                ok=true;
            if(ok)
                if(b[2][i]<cmin)
                {
                    cmin=b[2][i];
                    poz=b[1][i];
                }
            if(b[1][i]==y && ok)
                i=p+1;
        }
        o<<poz<<'\n';
    }
    return 0;
}