Cod sursa(job #52370)

Utilizator chermanCorina Herman cherman Data 18 aprilie 2007 19:35:50
Problema Stramosi Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <stdio.h>
#include <iostream>
#include <math.h>

using namespace std;

int N[250000];
int a[250000][18];

FILE *in = fopen("stramosi.in", "r"), *out = fopen("stramosi.out", "w");
int n, m;

inline int find(int nr, int times)
{
    int x = log2(times);
    while ( a[nr][x] == -1 )
        --x;

    if ( pow(2,x) == times )
        return a[nr][x];

    nr = a[nr][x];
    //cout << "--> " << x << " " << nr << endl;
	for ( int i = times-x-1; i != 0; --i )
	{
	    //cout << "--> " << N[a[nr][x]] << endl;
		if ( N[a[nr][x]] == 0 )
			return 0;
		nr = N[a[nr][x]-1];
	}

    //cout << "==> " << nr << endl;
	return nr;
}

int main ()
{
	int temp1, temp2;

	fscanf(in, "%d %d", &n, &m);

	for ( int i = 0; i != n; ++i )
	{
		fscanf(in, "%d", &N[i]);
		a[i][0] = N[i];
		for ( int j = 1; j != 18; ++j )
            a[i][j] = -1;
	}

	for ( int i = m-1; i != -1; --i )
	{
	    fscanf(in, "%d %d", &temp1, &temp2);
	    fprintf(out, "%d\n", find(temp1-1, temp2));
	}

	return 0;
}