All pastes #492525 Raw Edit

Mine

public cpp v1 · immutable
·published 2007-05-17 07:22 UTC
rendered paste body
#include<iostream>using namespace std;int T[400001],P[400001][10],N,father,child,number,p,q,L[400001];void process3(){      int i, j;      for (i = 0; i <=N; i++)          for (j = 0; 1 << j < N; j++)              P[i][j] = -1;      for (i = 0; i <=N; i++)          P[i][0] = T[i];      for (j = 1; 1 << j <=N; j++)         for (i = 0; i <=N; i++)             if (P[i][j - 1] != -1)                 P[i][j] = P[P[i][j - 1]][j - 1];}int query(){      int tmp, log, i;      if (L[p] < L[q])      {          tmp = p;           p = q;           q = tmp;      }          for (log = 1; 1 << log <= L[p]; log++);            log--;      for (i = log; i >= 0; i--)          if (L[p] - (1 << i) >= L[q])              p = P[p][i];      if (p == q)          return p;      for (i = log; i >= 0; i--)      {          if (P[p][i] != -1 && P[p][i] != P[q][i])          {              p = P[p][i];              q = P[q][i];          }          }          return T[p];}int main(){    scanf("%d",&N);    pair<int ,int> level[N];    T[0]=0;    L[0]=0;    for(int i=0;i<N;i++)    {         scanf("%d",&child);         scanf("%d",&father);         T[child]=father;         level[i]=make_pair(father,child);    }    sort(level,level+N);        for(int i=0;i<N;i++)        L[level[i].second]=L[level[i].first]+1;    process3();    scanf("%d",&number);    for(int i=0;i<number;i++)    {        scanf("%d",&p);        scanf("%d",&q);        cout<<query()<<endl;    }    }