Cod sursa(job #1771661)

Utilizator ducu34Albastroiu Radu Gabriel ducu34 Data 5 octombrie 2016 20:47:21
Problema Stramosi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
//
//  main.cpp
//  Stramosi
//
//  Created by Albastroiu Radu on 10/5/16.
//  Copyright © 2016 Albastroiu Radu. All rights reserved.
//

#include <iostream>
#include <fstream>
#include <algorithm>
#include <unordered_map>
#include <vector>

using namespace std;

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

int i, j, n, m, tip, x, y, z;
int dinamica[300001][25], lg[300002];

/* All you need to understand :

   d[i][j] = d[ d[i][j-1] ][j-1]
   i - element (node)
   j - distance (2^j)
   d[i][j] - parrent of i at 2^j distance */

int main()
{
    // read;
    fin >> n >> m;
    
    for(i=1;i<=n;i++)
        fin >> dinamica[i][0];
    
    // precompute dinamica
    for(i=2;i<=n;i++)
        lg[i] = lg[i>>1] + 1;

    for(j=1;j<18;j++)
    {
        for(i=1;i<=n;i++)
        {
            dinamica[i][j] = dinamica[ dinamica[i][j-1] ][j-1];
        }
    }
    
    // computing the distance in log time
    for(i=1;i<=m;i++)
    {
        fin >> x >> y;
        z = x;
        while(y > 0)
        {
            z = dinamica[z][lg[y]];
            y = y - (1<<lg[y]);
        }
        fout << z << "\n";
    }
    
    return 0;
}