Cod sursa(job #215779)

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

#define NMAX 250001
#define LOGMAX 17

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

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

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

int meta_bsrc(int nod,int nth)
{
 int k = logN, p = nod;
   for(; nth ; --k)
    if(1<<k <= nth)
      p = P[p][k], 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();
}