Errore con vari problemi OIS in particolare "23"

Stavo provando a risolvere alcuni problemi delle OIS ma spesso mi ritrovo con l’errore “Execution killed with signal 11 (could be triggered by violating memory limits)” che, se ho capito bene, dovrebbe riscontrarsi quando di cercano di accedere celle di memoria in maniera anomala (per esempio quando ho un array di dimensione 5 e cerco di accedere all’elemento 6). Il punto è che non riesco a capire dove ciò accada. Questo è il codice del problema “Bases Conversion”:

#include <iostream>

using namespace std;

int memo[1000001]; //sumbasetwo[1000000], sumbasethree[1000000];

int calcsumbasetwo(int k) {
	int sum = 0;
	while(k > 0) {
		sum += k % 2;
		k /= 2;
	}
	
	return sum;
}

int calcsumbasethree(int k) {
	int sum = 0;
	while(k > 0) {
		sum += k % 3;
		k /= 3;
	}
	
	return sum;
}

int main() {
	int t, max = 0;
	cin >> t;
	
	memo[0] = 0; 
	for(int caso = 0; caso < t; caso++) {
		int n;
		cin >> n;
		
		if(n > max) {
			for(int i = max + 1; i <= n; i++) {
//				sumbasetwo[i] = calcsumbasetwo(i);
//				sumbasethree[i] = calcsumbasethree(i);
//				if(sumbasetwo[i] == sumbasethree[i])
				if(calcsumbasetwo(i) == calcsumbasethree(i))		
					memo[i] = memo[i - 1] + 1;
				else memo[i] = memo[i - 1];
			}
			max = n;
		}
		
		cout << memo[n] << " ";
	}
}

Pensavo fosse un errore di utilizzo di troppa memoria e per questo ho inserito quei commenti ma nulla (adesso noto anche che il limite di memoria è di 64 MiB, io ne uso 4 con questa soluzione).
Ancora invece con fibonacci colonies:

#include <iostream>

using namespace std;

long long int f[100000];

int m(int w, int* memo, int* price, int* colony, int n) {
	if(w < 0) return -1;
	if(memo[w] == -1) {
		if(w == 0) memo[w] = 0; else {
			for(int i = 0; i < n; i++) {
				if(f[colony[i]] <= w) {
					memo[w] = max(price[i] + m(w - f[colony[i]], memo, price, colony, n), memo[w]);
				}
			}
		}
	}
	return memo[w];
}

int main() {	
	int t;
	cin >> t;
	
	for(int caso = 0; caso < t; caso++) {
		int maxf = 0, n, k;
		int memo[100000], colony[100000], price[100000];
		cin >> n >> k;
		
		for(int i = 0; i < n; i++) {
			cin >> colony[i] >> price[i];
			if(colony[i] > maxf) maxf = colony[i];
		}
		
		f[0] = 1;
		f[1] = 1;
		for(int i = 2; i <= maxf; i++)
			f[i] = f[i - 1] + f[i - 2];
		
		for(int i = 0; i <= k; i++) memo[i] = -1;
		cout << m(k, memo, price, colony, n) << endl;
	}
}

Vi prego di aiutarmi :cry:

Ciao! In 23 l’n che prendi in input può arrivare anche a 10^8, quindi quando dentro al for(int i = max + 1; i <= n; i++) accedi a memo[i] ti va fuori memoria, dato che memo è lungo 10^6.
In fibonaccibug invece credo che l’errore sia dovuto ad un problema di overflow, infatti neanche un long long può contenere F_n se n>92, quindi f[i] potrebbe anche essere un numero negativo, quindi quando vai a richiamare m(w - f[colony[i]], memo, price, colony, n), non hai nessun controllo su w - f[colony[i]] che può essere molto maggiore della grandezza di memo.