Cod sursa(job #2771444)

Utilizator RamanujanNeacsu Mihnea Ramanujan Data 27 august 2021 12:49:43
Problema Stramosi Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <fstream>

using namespace std;

const int maxn=25*1e4+1;
const int putere=19;
ifstream cin ("stramosi.in");
ofstream cout ("stramosi.out");
int tati[maxn], n, m, stramosi[maxn][putere];//tinem stramosii de ordin 2 la k
int p, depth;
int main(){
    cin>>n>>m;
    for(int i=1; i<=n; i++){
        cin>>tati[i];
    }
    //precalculam stramosii
    for(int j=0, lungime=1; lungime<=n; j++, lungime*=2){
        for(int i=1; i<=n; i++){
            if(j==0){
                stramosi[i][j]=tati[i];//pe cazul de baza, stramosul de grad 1 e tac'su
            }
            else{
                stramosi[i][j]=stramosi[stramosi[i][j-1]][j-1];
                //str[i][j-1] e stramos de ordin 2 la k, caruia ii calc stramosul de 2 la k
                //ca sa obtin stramosul de ordin 2 la k+1
            }
        }
    }
    for(int i=0; i<m; i++){
       cin>>p>>depth;
       int bitReached=0, currNode=p;
       while(depth!=0){//cat mai am biti in adancime
          if(depth%2==1){//daca am bitul 1
             currNode=stramosi[currNode][bitReached];//urc un nr egal de pasi cu bitul unde sunt
          }
          bitReached++;//avansez un bit
          depth>>=1;//si, of course, shiftez
       }
       cout<<currNode<<"\n";
    }
    return 0;
}