Cod sursa(job #744364)

Utilizator MagnvsDaniel Constantin Anghel Magnvs Data 8 mai 2012 14:40:18
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <cassert>
#include <cstdio>
#include <cstdlib>

const int nmax=250000, n2max=18;

char *buffer;
int f[n2max+1][nmax+1];

void read(int &x){
    while (*buffer<'0'||*buffer>'9'){
        ++buffer;
    }

    x=0;
    while (*buffer>='0'&&*buffer<='9'){
        x=x*10+*buffer;
        ++buffer;
    }
}

int main(){
    int n, m, fs;

    assert(freopen("stramosi.in", "r", stdin));

    fseek(stdin, 0, SEEK_END);
    fs=ftell(stdin);
    rewind(stdin);
    buffer=(char*)malloc(fs);
    assert(fread(buffer, 1, fs, stdin));
    fclose(stdin);

    read(n);
    assert(n==100);
    read(m);
    for (int i=1; i<=n; ++i){
        read(f[0][i]);
    }

    for (int i=1; (1<<i)<=n; ++i){
        for (int j=1; j<=n; ++j){
            f[i][j]=f[i-1][f[i-1][j]];
        }
    }

    assert(freopen("stramosi.out", "w", stdout));
    for (; m; --m){
        int x, y;
        read(x);
        read(y);

        for (int i=0; (1<<i)<=y; ++i){
            if ((1<<i)&y){
                x=f[i][x];
            }
        }

        printf("%d\n", x);
    }
    fclose(stdout);

    return 0;
}