// Sigue un AVL operación por operación. Cada argumento es una clave que se inserta,
// o una clave con signo menos que se borra: avl_trace 30 10 20 -10
#include <cstdlib>
#include <iostream>

#include "avl_set.h"

int main(int argc, char** argv) {
    AvlSet<int> tree;
    for (int i = 1; i < argc; i++) {
        int key = std::atoi(argv[i]);
        bool insert = key >= 0;
        if (insert) {
            tree.insert(key);
        } else {
            tree.erase(-key);
        }
        tree.check_invariants();
        std::cout << (insert ? "insertar " : "borrar ") << std::abs(key) << ": " << tree.shape() << "\n";
        for (const auto& repair : tree.last_repairs()) {
            std::cout << "    reparo en " << repair.key << ": " << repair.kind << "\n";
        }
    }
    std::cout << "altura " << tree.height() << ", rotaciones " << tree.rotations() << "\n";
    return 0;
}
