Cod sursa(job #1537964)

Utilizator MarcusPopMarcus Pop MarcusPop Data 28 noiembrie 2015 12:28:50
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
/// http://www.infoarena.ro/problema/stramosi
/// f[i][j] = 2 ^ i stramos a lui j
/// f[i][j] = f[i - 1][f[i - 1][j]]
/// f[0][i]  stiut din input;
/// query (p, q) = al p-lea strmos a lui q

#include <iostream>
#include <fstream>
#define NMAX 250005

using namespace std;

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

int     n, m;
int     f[19][NMAX];

int     query(int p, int q)
{
    for (int i = 0; (1 << i) <= p; i++)
    {
        if ((1 << i) & p) //// Exista bitul in p
            q = f[i][q];
    }
    return q;
}

void    rezolvare(void)
{
    int     nod1, nod2;

    fin >> n >> m;
    for (int i = 1; i <= n; i++)
        fin >> 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]];
    }
    for (int i = 1; i <= m; i++)
    {
        fin >> nod1 >> nod2;
        gout << query(nod1, nod2) << '\n';
    }
}

int main()
{
    rezolvare();
    return 0;
}