// Sigue Gale-Shapley propuesta por propuesta sobre el ejemplo de los apuntes.
#include <iostream>

#include "instances.h"

int main() {
    Preferences students = example_students();
    Preferences advisors = example_advisors();
    std::vector<std::vector<int>> rank = rank_table(advisors);
    int step = 0;
    Matching result = propose_until_stable(
        students,
        [&](int r, int a, int b) { return rank[r][a] < rank[r][b]; },
        [&](int p, int r, int held, bool accepted) {
            std::cout << ++step << ": t" << p << " propone a a" << r;
            if (held == -1) {
                std::cout << ", que estaba libre: acepta\n";
            } else if (accepted) {
                std::cout << ", que cambia a t" << held << " por t" << p << '\n';
            } else {
                std::cout << ", que se queda con t" << held << '\n';
            }
        });
    std::cout << "resultado:";
    for (int p = 0; p < static_cast<int>(result.partner.size()); p++) {
        std::cout << " t" << p << "-a" << result.partner[p];
    }
    std::cout << "\npropuestas: " << result.proposals << '\n';
    std::cout << "pares inestables: "
              << (find_unstable_pair(result.partner, students, advisors) ? "hay" : "ninguno") << '\n';
}
