int F_(state_t n, int alpha, int beta, bool color) {
    cout << "soy F" << endl;
    if (n.terminal()) {
        cout << " soy terminal y valgo: " << n.value() << endl;
        return n.value() ;//* (color ? 1 : -1);
    }

    int m = numeric_limits<signed int>::min();
    vector<int> succ_ = n.succ(color);
    if (succ_.size() != 0) {
        cout << " voy a jugar: " << succ_.front() << endl;
        state_t jugada = n.move(color, succ_.front());
        cout << " hice jugada " << endl;
        succ_.erase(succ_.begin());
        int valor = G_(jugada, alpha, beta, !color);
        m = MAX(m, valor);
        if ( m >= beta) {
            return m;
        }

        for(vector<int>::const_iterator iter=succ_.begin(),limit=succ_.end(); iter!=limit; ++iter) {
            jugada = n.move(color, *iter);
            int t = G_(jugada,m,m + 1, !color);
            if(t > m) {
                if(t >= beta) {
                    m = t;
                }
                else {
                    m = G_(jugada, t, beta, !color);
                }
            }
            if(m >= beta) {
                return beta;
            }
        }
    } else {
        return G_(n.move(color, 36), alpha, beta, !color);
    }
    return m;
}
int G_(state_t n, int alpha, int beta, bool color) {
    cout << "soy G" << endl;
    if (n.terminal()) {
        cout << " soy terminal y valgo: " << n.value() << endl;
        return n.value() ;//* (color ? 1 : -1);;
    }

    int m = numeric_limits<signed int>::max();
    vector<int> succ_ = n.succ(color);
    if (succ_.size() != 0) {
        state_t jugada = n.move(color, succ_.front());
        succ_.erase(succ_.begin());
        int valor = F_(jugada, alpha, beta, !color);
        m = MIN(m, valor);
        if ( m <= alpha) {
            return m;
        }

        for(vector<int>::const_iterator iter=succ_.begin(),limit=succ_.end(); iter!=limit; ++iter) {
            cout << " expando: " << *iter << endl;
            jugada = n.move(color, *iter);
            int t = F_(jugada,m,m + 1,!color);
            if(t <= m) {
                if(t <= alpha) {
                    m = t;
                }
                else {
                    m = F_(jugada,alpha,t,!color);
                }
            }
            if(m <= alpha) {
                return alpha;
            }
        }
    } else {
        return F_(n.move(color, 36), alpha, beta, !color);
    }
    return m;
}