Pagini recente » Cod sursa (job #2076557) | Cod sursa (job #1058508) | Cod sursa (job #840639) | Cod sursa (job #2054168) | Cod sursa (job #1771661)
//
// 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;
}