Cod sursa(job #2973719)

Utilizator StefanL2005Stefan Leustean StefanL2005 Data 1 februarie 2023 18:53:51
Problema Stramosi Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;
ifstream in("stramosi.in");
ofstream out("stramosi.out");


int Stramos(int Q, int P, vector<int> &V)
{
    if (P == 0)
        return Q;
    if (V[Q] == -1)
        return -1;

    return Stramos(V[Q], P - 1, V);
}

int Stra_Log(int Q, int P, vector<int> &V, vector< vector<int> > &M)
{
    int l = 0;
    while ( (1 << l) <= P )
        l++;
    l--;

    Q = M[l][Q];
    P -= (1 << l);

    if (P == 0)
        return Q;
    if (Q == -1)
        return -1;

    return Stramos(Q, P, V);
}
int main()
{
    int n, m;
    in>> n >> m;

    vector<int> V(n);
    for (int i = 0; i < n; i++)
    {
        in>> V[i];
        V[i]--;
    }

    int p = 0;
    while ( (1 << p) < n)
        p++;
    p--;

    vector< vector<int> > M(p + 1, vector<int> (n, 0));

    for (int i = 0; i < n; i++)
        M[0][i] = V[i];

    for (int i = 1; i <= p; i++)
        for (int j = 0; j < n; j++)
            if (M[i - 1][j] == -1)
                M[i][j] = M[i - 1][M[i - 1][j]] = -1;
            else
                M[i][j] = M[i - 1][M[i - 1][j]];

    for (int t = 0; t < m; t++)
    {
        int Q, P;
        in>> Q >> P; Q--;

        out<< Stra_Log(Q, P, V, M) + 1 << "\n";
    }

    return 0;
}