Pagini recente » Cod sursa (job #3201285) | Cod sursa (job #2465293) | Cod sursa (job #3281378) | Cod sursa (job #2941467) | Cod sursa (job #1301212)
#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; }