Cod sursa(job #1321627)

Utilizator somuBanil Ardej somu Data 19 ianuarie 2015 13:42:46
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.86 kb
#include <iostream>
#include <fstream>
#define nmax 250005

using namespace std;

ifstream fin("stramosi.in");
ofstream fout("stramosi.out");

int n, m, nod, p;
int stramos[20][nmax], Exp[nmax];

void citire() {
    fin >> n >> m;
    for (int i = 1; i <= n; i++)
        fin >> stramos[0][i];
}

int find(int p, int nod) {
    if (p > n) return 0;
    if (p == 0) return nod;
    int i = Exp[p];
    return find(p - (1<<i), stramos[i][nod]);
}

void solve() {
    for (int i = 1; (1<<i) <= n; i++)
        for (int j = 1; j <= n; j++)
            stramos[i][j] = stramos[i-1][stramos[i-1][j]];
    
    for (int i = 2; i <= n; i++)
        Exp[i] = Exp[i/2] + 1;
    
    for (int i = 1; i<= m; i++) {
        fin >> nod >> p;
        fout << find(p, nod) << "\n";
    }
}

int main() {
    
    citire();
    solve();
    
    fin.close();
    fout.close();
    
    return 0;
}