// Imprime el trabajo de cada nivel del árbol de recursión.
#include <iomanip>
#include <iostream>
#include <string>
#include <vector>

#include "recurrences.h"

template <typename F>
static void print_tree(const std::string& title, int a, int k, F f) {
    std::cout << title << ", n = " << (1 << k) << '\n';
    std::vector<long double> levels = level_work<long double>(a, k, f);
    long double total = 0;
    for (std::size_t i = 0; i < levels.size(); i++) {
        if (i + 1 == levels.size()) {
            std::cout << "  hojas   ";
        } else {
            std::cout << "  nivel " << i << " ";
        }
        std::cout << std::setw(8) << std::fixed << std::setprecision(2) << levels[i] << '\n';
        total += levels[i];
    }
    std::cout << "  total   " << std::setw(8) << total << "\n\n";
}

int main() {
    print_tree("8 T(n/2) + n^2", 8, 4, f_n2);
    print_tree("2 T(n/2) + n", 2, 4, f_n);
    print_tree("2 T(n/2) + n^2", 2, 4, f_n2);
    print_tree("2 T(n/2) + n log n", 2, 4, f_n_log_n);
    print_tree("2 T(n/2) + n / log n", 2, 4, f_n_over_log_n);
}
