Pagini recente » Cod sursa (job #727564) | Cod sursa (job #1057788) | Cod sursa (job #2990132) | Cod sursa (job #671010) | Cod sursa (job #2889991)
#include <iostream>
using namespace std;
FILE *fin = fopen("stramosi.in", "r");
FILE *fout = fopen("stramosi.out", "w");
int dads[20][250005];
int maxx[250005];
char buff[4000000];
int main()
{
int N, M;
fscanf(fin, "%d %d", &N, &M);
for (int i = 1; i <= N; i++)
{
fscanf(fin, "%d", &dads[0][i]);
maxx[i] = 1 << 20;
}
for (int j = 1; j < 20; j++)
for (int k = 1; k <= N; k++)
{
dads[j][k] = dads[j - 1][dads[j - 1][k]];
if (dads[j][k] == 0)
maxx[k] = min(maxx[k], 1 << j);
}
fscanf(fin, "\n");
fread(buff, 1, 4000000, fin);
int currentPos = 0;
while (M--)
{
long long q, p;
p = 0;
q = 0;
int read = 0;
for (; buff[currentPos] != '\0' && read < 2; currentPos++)
{
if (buff[currentPos] == '\n' || buff[currentPos] == ' ')
read++;
else if (buff[currentPos] >= '0' && buff[currentPos] <= '9')
{
if (read == 0)
{
q *= 10;
q += buff[currentPos] - '0';
}
else
{
p *= 10;
p += buff[currentPos] - '0';
}
}
}
long long pow2 = 0;
long long current = q;
if (p >= maxx[current])
{
fprintf(fout, "0\n");
continue;
}
int minn = min(maxx[q], 1 << 19);
while ((1 << pow2) <= maxx[q])
{
if ((p & (1 << pow2)) != 0)
current = dads[pow2][current];
pow2++;
}
fprintf(fout, "%lld\n", current);
}
}