Pagini recente » Cod sursa (job #631313) | Cod sursa (job #1313369) | Clasamentul arhivei de probleme | Cod sursa (job #3280289) | Cod sursa (job #2879214)
#include <fstream>
#include <cmath>
#include <set>
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
int n, i, j, m, p, q, anc[250001][21];
int main()
{
fin >> n >> m;
set <int> toUpd;
toUpd.insert(0);
for (i = 1; i <= n; i++)
{
fin >> anc[i][0];
toUpd.insert(i);
}
int sz = int(log2(n));
for (j = 1; j <= sz; j++)
{
set<int>::iterator it = toUpd.begin();
for (it++; it != toUpd.end(); it++)
{
anc[(*it)][j] = anc[anc[(*it)][j-1]][j-1];
if (anc[(*it)][j] == 0)
{
set <int> :: iterator it2 = it;
it2--;
toUpd.erase(it);
it = it2;
}
}
}
for (j = 1; j <= m; j++)
{
fin >> q >> p;
int str = q;
while (p > 0)
{
str = anc[str][int(log2(p))];
p -= (1 << int(log2(p)));
}
fout << str << "\n";
}
return 0;
}