Cod sursa(job #1128065)

Utilizator projectanduFMI Stanescu Andrei Alexandru projectandu Data 27 februarie 2014 15:11:03
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include <vector>
#define INF 0x33ffff
using namespace std;

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

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;
        if(!t[a[j][i]])
        {
            ppoz[a[j][i]]=p;
            t[a[j][i]]=true;
        }
        lca(a[j][i]);

        b[1][++p]=j;
        nr--;
        b[2][p]=nr;
        if(!t[a[j][i]])
        {
            ppoz[a[j][i]]=p;
            t[a[j][i]]=true;
        }
    }
}

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;
    ppoz[1]=1;
    t[1]=true;
    lca(1);
    while(d>>x>>y)
    {
        cmin=INF;
        ok=false;
        if(ppoz[x]<ppoz[y])
        {
            for(i=ppoz[x]; i<=ppoz[y]; i++)
            {

                if(b[2][i]<cmin)
                {
                    cmin=b[2][i];
                    poz=b[1][i];
                }

            }
        }
        else
        {
            for(i=ppoz[y]; i<=ppoz[x]; i++)
            {
                if(b[2][i]<cmin)
                {
                    cmin=b[2][i];
                    poz=b[1][i];
                }
            }
        }
        o<<poz<<'\n';
    }
    return 0;
}