Cod sursa(job #1301212)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 25 decembrie 2014 18:31:23
Problema Stramosi Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <vector>
using std::vector;

#include <fstream>
using std::ifstream;
using std::ofstream;

#include <iostream>
using std::cout;

template <int grad_de_memoizare>
class stramosi_memoizat{
	const vector<int>& stramosi;
	vector<vector<int> > memoizare;
	void adauga_stramos_la(const int persoana){
		const int ultimul_stramos = *memoizare[persoana].rbegin();
		const int stramos_nou = stramosi[ultimul_stramos];
		memoizare[persoana].push_back(stramos_nou); }
public:
	stramosi_memoizat(const vector<int>& S, const int n):
		stramosi(S),
		memoizare(n+1){
		for(int i = 0; i <= n; ++i){
			memoizare[i].push_back(i);
			for(int j = 1; j <= grad_de_memoizare; ++j){
				adauga_stramos_la(i); } } }
	int operator()(const int grad, const int persoana){
		if(grad > grad_de_memoizare){
			return (*this)(grad - grad_de_memoizare, *(memoizare[persoana].rbegin())); }
		else{
			return memoizare[persoana][grad]; } } };

int main(){
	ifstream f("stramosi.in");
	ofstream g("stramosi.out");
	int marime_familie = 0, nr_intrebari;
	f >> marime_familie >> nr_intrebari;
	vector<int> stramosi(marime_familie+1, 0);
	for(int i = 1; i <= marime_familie; ++i){
		f >> stramosi[i]; }
	stramosi_memoizat<16> s(stramosi, marime_familie);
	for(int i = 0; i < nr_intrebari; ++i){
		int P = 0, Q = 0;
		f >> Q >> P;
		//nu inteleg de ce, in problema, zic al P-lea stramos al lui Q
		// dar ne dau datele cu Q mai intai!!
		g << s(P, Q) << '\n'; }
	return 0; }