Cod sursa(job #215782)

Utilizator mika17Mihai Alex Ionescu mika17 Data 20 octombrie 2008 23:25:03
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <stdio.h>

#define NMAX 350001
#define LOGMAX 18

int N,M,logN,P[LOGMAX][NMAX];

void read_me()
{
        freopen("stramosi.in","r",stdin);
        scanf("%d%d",&N,&M);
        
        for(int i = 1; i <= N; ++i)
          scanf("%d",&P[0][i]);
}

void proc()             // O(N log N)
{
        int log;
        for(log = 1; 1<<log <=N ; ++log)
          for(int i = 1; i <= N; ++i)
           if(P[log - 1][i])
             P[log][i] = P[log - 1][ P[log - 1][i]];
        logN = --log;
}

int meta_bsrc(int nod,int nth)
{
 int k = logN, p = nod;
   for(; nth ; --k)
    if(1<<k <= nth)
      p = P[k][p], nth -= 1<<k;
 return p;
}

void query()   // O(M log N)
{
        int n,nth;

        freopen("stramosi.out","w",stdout);
        
        while(M--)
        {
         scanf("%d%d",&n,&nth);
         printf("%d\n",meta_bsrc(n,nth));
        }
}

int main()
{
 read_me();
 proc();
 query();
}