Pagini recente » Cod sursa (job #2741689) | Cod sursa (job #328843) | Cod sursa (job #1700767) | Cod sursa (job #146535) | Cod sursa (job #1423974)
#include <vector>
#include <fstream>
#include <cmath>
using namespace std;
void fa_tabel_stramosi(vector<vector<int> >& tabel_stramosi){
for(int i = 1, intermediar; i < tabel_stramosi[i].capacity(); ++i){
for(int j = 0; j < tabel_stramosi.size(); ++j){
if(tabel_stramosi[j].back() != 0){
intermediar = tabel_stramosi[j][i-1];
if(tabel_stramosi[intermediar].size() <= i-1){
tabel_stramosi[j].push_back(0); }
else{
tabel_stramosi[j].push_back(tabel_stramosi[intermediar][i-1]); } } } } }
int get_ans(const vector<vector<int> >& tabel_stramosi, int num, int h){
for(int i = 0; h; ++i){
if(h & (1<<i)){
num = tabel_stramosi[num][i];
h ^= (1<<i); } }
return num; }
int main(){
ifstream f("stramosi.in");
int n = 0, q = 0;
f >> n >> q;
const int nr_max_stramosi = log2(n);
vector<vector<int> > tabel_stramosi(n+1, vector<int>(1, 0));
for(int i = 1; i <= n; ++i){
tabel_stramosi[i].reserve(nr_max_stramosi+1);
f >> tabel_stramosi[i][0]; }
fa_tabel_stramosi(tabel_stramosi);
ofstream g("stramosi.out");
for(int i = 0, num, h; i < q; ++i){
f >> num >> h;
g << get_ans(tabel_stramosi, num, h) << '\n'; }
return 0; }