Cod sursa(job #744340)

Utilizator MagnvsDaniel Constantin Anghel Magnvs Data 8 mai 2012 14:01:46
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.86 kb
#include <cassert>
#include <cstdio>

const int nmax=250000, n2max=18;

int f[n2max+1][nmax+1];

int main(){
    int n, m;

    assert(freopen("stramosi.in", "r", stdin));
    assert(scanf(" %d %d ", &n, &m));
    for (int i=1; i<=n; ++i){
        assert(scanf(" %d ", &f[0][i]));
    }

    for (int i=1; (1<<i)<=n; ++i){
//        fprintf(stderr, "%d:", (1<<i));
        for (int j=1; j<=n; ++j){
            f[i][j]=f[i-1][f[i-1][j]];
//            fprintf(stderr, " %d", f[i][j]);
        }
//        fprintf(stderr, "\n");
    }

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

        assert(scanf(" %d %d", &x, &y));
        
        for (int i=0; (1<<i)<=y; ++i){
            if ((1<<i)&y){
                x=f[i][x];
            }
        }

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

    return 0;
}