import std.string;
import std.algorithm;
import std.math;
import std.array;
import std.format;
import std.range;
import std.stdio;
import std.conv;

struct Node
{
    size_t value;
    Node*[] childs;

    static
    Node* parse(string str)
    {
        Node* dst = new Node;
        size_t cnt;
        foreach(e; str) if(e == '[') ++cnt; else break;
        if(cnt == 1){
            dst.value = str[1 .. $-1].to!uint;
            return dst;
        }else{
            size_t s, c;
            foreach(i, e; str){
                if(c == 1) s = i;
                if(e == '[') {++c; if(c == 1) s = i;};
                if(e == ']') {--c; if(c == 1) dst.childs ~= parse(str[s .. i+1]); };
            }
        }

        return dst;
    }

    string toString()
    {
        if(childs.length == 0) return '[' ~ value.to!string ~ ']';
        else{
            auto app = appender!string();
            app.put('[');
            foreach(e; childs)
                app.put(e.toString());
            app.put(']');
            return app.data;
        }
    }

    size_t query()
    {
        if(childs.length == 0) return (value + 1)/2;
        else{
            int[] vs;
            foreach(e; childs) vs ~= e.query;
            vs.sort();
            vs = vs[0 .. ($+1)/2];
            return vs.sum;
        }
    }
}


void main()
{
    foreach(i; 0 .. readln().chomp().to!size_t){
        writeln(Node.parse(readln().chomp()).query);
    }
}