Cod sursa(job #1505193)

Utilizator andrei_diaconuAndrei Diaconu andrei_diaconu Data 18 octombrie 2015 21:18:42
Problema Stramosi Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <fstream>
#include <vector>
#include <stdio.h>

#define in "stramosi.in"
#define out "stramosi.out"
#define NMax 250010
#define DIM 10000

using namespace std;

int n, m, elem, d[20][NMax], pos;
char buffer[DIM];

void readNum(int &num) {
    num = 0;
    
    if (buffer[pos] < '0' || buffer[pos] > '9') {
        pos++;
        if (pos == DIM) {
            fread(buffer, 1, DIM, stdin);
            pos = 0;
        }
    }
    
    while (buffer[pos] >= '0' && buffer[pos] <= '9') {
        num = num*10 + (buffer[pos]-'0');
        pos++;
        if (pos == DIM) {
            fread(buffer, 1, DIM, stdin);
            pos = 0;
        }
    }
}

int main()
{
    freopen(in, "r", stdin);
    freopen(out, "w", stdout);
    
    fread(buffer, 1, DIM, stdin);
    
    readNum(n);
    readNum(m);
        
    for (int i=1; i<=n; i++)
        readNum(d[0][i]);
    
    int lg = 1;
    for (; (1<<lg) <= n; lg++);
    lg--;
    
    for (int i=1; i<=lg; i++)
        for (int j=1; j<=n; j++)
            d[i][j] = d[i-1][d[i-1][j]];
    
    int p=0, q=0;
    for (int i=1; i<=m; i++) {
        readNum(p);
        readNum(q);
        
        int x=0;
        while (q != 0) {
            if ((q & 1) == 1)
                p=d[x][p];
            
            q >>= 1;
            x++;
        }
        
        printf("%d\n", p);
    }
    
    return 0;
}