Cod sursa(job #871140)

Utilizator andreas_mihAndreas Mihaloianis andreas_mih Data 4 februarie 2013 15:22:43
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include<stdio.h>
#include<vector>
using namespace std;
FILE*in=fopen("lca.in","r");
FILE*out=fopen("lca.out","w");
int tata[100001],nivel[100001],noduri,query;
int main()
{
    fscanf(in,"%d%d",&noduri,&query);
    for(int i=2;i<=noduri;++i)
        {
            fscanf(in,"%d",&tata[i]);
            nivel[i]=nivel[tata[i]]+1;
        }
    for(int i=0;i<query;++i)
    {
        int nod1,nod2;
        fscanf(in,"%d%d",&nod1,&nod2);
        if(nivel[nod1]>nivel[nod2])
        {
            while(nivel[nod2]!=nivel[nod1])
                nod1=tata[nod1];
            if(nod1==nod2)
                fprintf(out,"%d\n",nod1);
            else
            {
                while(tata[nod1]!=tata[nod2])
                {
                    nod2=tata[nod2];
                    nod1=tata[nod1];
                }
                fprintf(out,"%d\n",tata[nod1]);
            }
        }
        else
        {
            while(nivel[nod2]!=nivel[nod1])
                nod2=tata[nod2];
            if(nod1==nod2)
                fprintf(out,"%d\n",nod1);
            else
            {
                while(tata[nod1]!=tata[nod2])
                {
                    nod2=tata[nod2];
                    nod1=tata[nod1];
                }
                fprintf(out,"%d\n",tata[nod1]);
            }
        }
    }
fclose(in);
fclose(out);
}