Cod sursa(job #1423974)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 23 aprilie 2015 04:54:15
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#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; }