Guest User

Untitled

a guest
Aug 13th, 2015
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.19 KB | None | 0 0
  1. #include<fstream>
  2. #include<algorithm>
  3. using namespace std;
  4.  
  5. typedef struct lnod {
  6.       int info;
  7.       lnod *next;
  8. }*nod;
  9.  
  10. int e[200005],h[200005],lg[200005],rmq[20][200005],poz[100005];
  11. int nr,x,y,gmb,fnc,dif,l,sh,rs,m,n,i;
  12. nod lda[100005];
  13.  
  14. void add(int x,nod &y) {
  15.     nod p=new lnod;
  16.     p->info=x;
  17.     p->next=y;
  18.     y=p;
  19. }
  20.  
  21. void dfs(int x,int niv) {
  22.    h[++nr]=niv; e[nr]=x; poz[x]=nr;
  23.    for(nod p=lda[x];p;p=p->next)
  24.    dfs(p->info,niv+1),h[++nr]=niv,e[nr]=x;
  25. }
  26.  
  27. void RMQ() {
  28.   int i,j,l;
  29.   for(rmq[0][1]=1,i=2;i<=nr;++i)
  30.   lg[i]=lg[i/2]+1,rmq[0][i]=i;
  31.  
  32.   for(i=1;(1<<i)<nr;++i)
  33.     for(j=1;j+(1<<i)<nr;++j)
  34.     {
  35.       l=1<<(i-1);
  36.       rmq[i][j]=rmq[i-1][j];
  37.       if(h[rmq[i-1][j+l]]<h[rmq[i][j]])
  38.       rmq[i][j]=rmq[i-1][j+l];
  39.     }
  40. }
  41.  
  42. int main()
  43. {
  44.   ifstream cin("lca.in");
  45.   ofstream cout("lca.out");
  46.  
  47.   cin>>n>>m;
  48.   for(i=2;i<=n;++i) cin>>x,add(i,lda[x]);
  49.  
  50.   dfs(1,0); RMQ();
  51.  
  52.   while(m--)
  53.   {
  54.     cin>>x>>y;
  55.     gmb=poz[x]; fnc=poz[y];
  56.     if(gmb>fnc) swap(gmb,fnc);
  57.  
  58.     dif=fnc-gmb+1; l=lg[dif];
  59.     sh=dif-(1<<l); rs=rmq[l][gmb];
  60.     if(h[rs]>h[rmq[l][sh+gmb]]) rs=rmq[l][sh+gmb];
  61.  
  62.     cout<<e[rs]<<'\n';
  63.   }
  64.  
  65.  return 0;
  66. }
Advertisement
Add Comment
Please, Sign In to add comment