Cod sursa(job #324497)

Utilizator BrEacKRazvan Aurariu BrEacK Data 16 iunie 2009 12:35:55
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<iostream>
using namespace std;

int main()
{
    int n,m;
    int pmax = 0;
    FILE *in = fopen("stramosi.in", "r");
    FILE *out = fopen("stramosi.out", "w");
    fscanf(in,"%d %d",&n,&m);
    //int mat[100][10];
    int nn = n;
    while(nn) {
        ++pmax;
        nn = nn>>1;
    }
    --pmax;
    //cout << pmax;
    int  ** mat = (int**)malloc( (n+1)*sizeof(int ) );
    for(int i = 0 ; i<=n ; ++i) {
        mat[i] = (int *) malloc( (pmax+1)*sizeof(int));
    }
    for(int i = 0; i<=pmax; ++i)
        mat[0][i] = 0;
    for(int j = 1; j <= n; ++j) {
        int k;
        fscanf(in,"%d",&mat[j][0]);
        for(int i=1;i<=pmax; ++i){
            k = mat[j][i-1];
            mat[j][i] = mat[k][i-1];
        }

    }
    //cout<<pmax;
    int p,q;
    for( int i = 1; i<= m; ++i) {
        fscanf(in,"%d %d",&q,&p);
        if(p < n) {
            //k = 1<<pmax;
            int j = pmax;
            int k = 1<<pmax;
            for(; q && p ;) {
                if( k <= p) {
                    p -= k;
                    q = mat[q][j];
                }
                k >>=1; --j;
            }
            fprintf(out,"%u\n",q);
        } else
            fprintf(out,"%u\n",0);
    }

    fclose(in);
    fclose(out);
    return 0;
}