Cod sursa(job #2761317)

Utilizator Virgil993Virgil Turcu Virgil993 Data 1 iulie 2021 17:18:48
Problema Stramosi Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.16 kb
#include<bits/stdc++.h>
#include<iostream>

using namespace std;

ifstream fin("stramosi.in");
ofstream fout("stramosi.out");


int stramosi[250005][20];

//folosim principiul de lowest ancestor care se poate asemana cu rmq
//retinem in vectorul stramosi toti stramosii de ordin 2^k, si atunci cand cautam un stramos sarim log2(n) stramosi ca sa ajungem mai repede la rezultat
void interogare(int poz,int ord)
{
        int power = int(log2(ord));//retinem cea mai apropiata putere a lui 2 fata de numarul de ordine
        ord = ord - pow(2,power);//facem diferenta pentru a vedea daca mai este nevoie sa continuam
        if(ord == 0)//daca numarul de ordine este 0 ne oprim pentru ca numarul de ordine este o putere a lui 2 si deja stim raspunsul din vectorul stramosi
            fout<<stramosi[poz][power]<<"\n";
        else//daca nu este = 0 inseamna ca mai trebuie sa parcurgem stramosi
        {
            if(stramosi[poz][power]==0)//verificam intai daca mai avem unde sa ne ducem din punctul curent (daca punctul curent are un stramos direct diferit de 0)
                fout<<0<<"\n";
            else//daca are un stramos direct nenul , atunci pozitia curenta primeste stramosul din care vom aplica acelasi algoritm cu numarul de ordine actualizat
            {
                poz = stramosi[poz][power ];
                interogare(poz,ord);
            }
        }

}

int main()
{
    int n,m,poz,ord;
    fin>>n>>m;
    for(int i=1;i<=n;i++)//initializam prima linie de stramosi(stramosi de ordin 1)
    {
            fin>>stramosi[i][0];
            cout<<stramosi[i][0]<<" ";
    }
    for(int j=1;j<=int(log2(n));j++)//initializam restul liniilor asigurandu-ne ca stramosul urmator exista(in cazul in care nu exista atunci doar punem valoare 0 la stramosi de ordin mai mare)
    {
    cout<<"\n";
    for(int i=1;i<=n;i++)
    {
        if(stramosi[i][j-1]==0)
            stramosi[i][j]=0;
        else
            stramosi[i][j] = stramosi[stramosi[i][j-1]][j-1];
        cout<<stramosi[i][j]<<" ";

    }
    }
    for(int i=0;i<m;i++)
    {
        fin>>poz>>ord;
        interogare(poz,ord);

    }

    return 0;
}