Pagini recente » Cod sursa (job #2927517) | Cod sursa (job #2181972) | Cod sursa (job #2784470) | Cod sursa (job #2462375) | Cod sursa (job #3207634)
#include <bits/stdc++.h>
using namespace std;
#ifndef LOCAL
ifstream in("stramosi.in");
ofstream out("stramosi.out");
#define cin in
#define cout out
#endif
const int nmax = 25e4 + 7;
const int exp_max = 20;
int parinte[nmax];
int memo[nmax][exp_max];
int saritura_p2(int node, int exp)
{
const int speed = 3;
if(speed == 1)
{
for(int rep = 0; rep < (1 << exp); rep++)
{
node = parinte[node];
}
return node;
}
if(speed == 2)
{
if(exp == 0)
{
return parinte[node];
}
node = saritura_p2(node, exp - 1);
node = saritura_p2(node, exp - 1);
return node;
}
if(speed == 3)
{
if(exp == 0)
{
return parinte[node];
}
if(memo[node][exp] != -1)
{
return memo[node][exp];
}
int init_node = node;
node = saritura_p2(node, exp - 1);
node = saritura_p2(node, exp - 1);
memo[init_node][exp] = node;
return node;
}
}
int main()
{
ios_base::sync_with_stdio(false);
in.tie(0);
out.tie(0);
for(int i = 0; i < nmax; i++)
{
for(int j = 0; j < exp_max; j++)
{
memo[i][j] = -1;
}
}
int n, q;
in >> n >> q;
for(int i = 1; i <= n; i++)
{
in >> parinte[i];
}
for(int exp = 0; exp < exp_max; exp++)
{
for(int node = 0; node < nmax; node++)
{
if(exp == 0)
memo[node][exp] = parinte[node];
else
{
memo[node][exp] = memo[memo[node][exp - 1]][exp - 1];
}
}
}
while(q--)
{
int node, pas;
in >> node >> pas;
const int exp_max = 18;
for(int exp = 0; exp <= exp_max; exp++)
{
if(pas & (1 << exp))
{
node = saritura_p2(node, exp);
}
}
out << node << '\n';
}
}