Cod sursa(job #2889984)

Utilizator MortemPlaiasu Iulia-Silvia Mortem Data 14 aprilie 2022 00:16:17
Problema Stramosi Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <iostream>

using namespace std;

FILE *fin = fopen("stramosi.in", "r");
FILE *fout = fopen("stramosi.out", "w");

int dads[20][250005];
int maxx[250005];

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] = 20;
    }
    for (int j = 1; j < 19; 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], j);
        }
    while (M--)
    {
        long long q, p;
        fscanf(fin, "%lld %lld", &q, &p);
        long long pow2 = 0;
        long long current = q;
        if (p > (1 << maxx[current]))
        {
            fprintf(fout, "0\n");
            continue;
        }
        while (pow2 <= maxx[current] + 1 && pow2 < 20)
        {
            if ((p & (1 << pow2)) != 0)
            {
                p -= 1 << pow2;
                current = dads[pow2][current];
            }
            pow2++;
        }
        fprintf(fout, "%lld\n", current);
    }
}