Pagini recente » Cod sursa (job #2977281) | Cod sursa (job #715673) | Cod sursa (job #2179947) | Cod sursa (job #702213) | Cod sursa (job #2761317)
#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;
}