Cod sursa(job #1759745)

Utilizator GandalfTheWhiteGandalf the White GandalfTheWhite Data 19 septembrie 2016 19:13:46
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>
#define N 300000
#include <algorithm>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,t[N],x,y,px,py,euler[N],nivel[N],lca,mini=N,k,m,val;
struct Nod{
           int nod;
           Nod *urm;
          }*l[N];
void read()
{
int i;
Nod *p;
fin>>n>>m;
for (i=2;i<=n;i++)
   {
   fin>>t[i];
   p=new Nod;p->nod=i;p->urm=l[t[i]];l[t[i]]=p;
   }
}
void Euler(int x,int niv)
{
Nod *p;
euler[++k]=x;
nivel[k]=niv;
for (p=l[x];p!=NULL;p=p->urm)
   {
   Euler(p->nod,niv+1);
   euler[++k]=x;
   nivel[k]=niv;
   }
}
int main()
{
int i;
read();
Euler(1,1);
while (m--)
   {
   fin>>x>>y;
   for (i=k;i>0;i--)
   if (x==euler[i]) {
                    px=i;
                    break;
                    }
   for (i=k;i>0;i--)
   if (y==euler[i]) {
                     py=i;
                     break;
                    }
   val=min(px,py);
   py=max(px,py);
   px=val;mini=10000000;
   for (i=px;i<=py;i++)
   if (mini>nivel[i]) {
                     lca=euler[i];
                     mini=nivel[i];
                    }
   fout<<lca<<'\n';
   }
}