Cod sursa(job #771145)

Utilizator SchumiDumitru Andrei Georgian Schumi Data 24 iulie 2012 22:53:36
Problema Stramosi Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <cstdio>
#include <fstream>
#include <cmath>
#include <string>
#include <cstring>
using namespace std;

const int N = 250005;

int n, m, dim, x, y, sol, nr;
int tata[N];
int stramosi[20][N];
char s[1760000];


int main()
{
    freopen ("stramosi.in", "r", stdin);
    freopen ("stramosi.out", "w", stdout);
    fgets(s, 20, stdin);
    dim = strlen(s);
    for(int i = 0; i < dim; ++i) {
        nr = 0;
        while(isdigit(s[i])) {
            nr = nr * 10 + s[i] - '0';
            ++i;
        }
        if(n != 0)
            m = nr;
        else n = nr;
    }
    memset(s, 0, sizeof(s));
    fgets(s, 1750005, stdin);
    dim = strlen(s);
    for(int i = 0; i < dim; ++i) {
        nr = 0;
        while(isdigit(s[i])) {
            nr = nr * 10 + s[i] - '0';
            ++i;
        }
        ++tata[0];
        tata[tata[0]] = nr;
        stramosi[0][tata[0]] = tata[tata[0]];
    }
    tata[0] = 0;
    dim = ceil(log2(n));
    for(int i = 1; i <= dim; ++i)
        for(int j = 1; j <= n; ++j)
            stramosi[i][j] = stramosi[i - 1][stramosi[i - 1][j]];

    for(int i = 1; i <= m; ++i) {
        x = y = 0;
        memset(s, 0, sizeof(s));
        fgets(s, 20, stdin);
        dim = strlen(s);
        for(int j = 0; j < dim; ++j) {
            nr = 0;
            while(isdigit(s[j])) {
                nr = nr * 10 + s[j] - '0';
                ++j;
            }
            if(x != 0)
                y = nr;
            else x = nr;
        }
        fprintf(stderr, "%d %d\n", x, y);
        int k = 0;
        while((1 << (k + 1)) < y)
            ++k;
        sol = stramosi[k][x];
        for(int j = 1; j <= (y - (1 << k)) ; ++j)
            sol = tata[sol];
        printf("%d\n", sol);
    }
    
    return 0;
}