1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <iostream>
#include <vector>
#include <algorithm>
#include <limits>
using namespace std;

struct Cmd{
    char opcode;
    int val;
};

int n;
vector<vector<Cmd>>Programs;
vector<int>ProgramCounters;
vector<long long>PrivateCounters;
long long globalCounter, bestVal;

void R(){
    bool finished=true;

    for(int i=0;i<n;i++)
        if(ProgramCounters[i]<(int)Programs[i].size()){
            finished=false;
            Cmd cmd = Programs[i][ProgramCounters[i]];
            ProgramCounters[i]++;
            switch(cmd.opcode){
                case 'W':{
                    long long y_copy = PrivateCounters[i];
                    PrivateCounters[i] = globalCounter;
                    R();
                    PrivateCounters[i] = y_copy;
                    break;
                }
                case 'Z':{
                    long long x_copy = globalCounter;
                    globalCounter = PrivateCounters[i];
                    R();
                    globalCounter = x_copy;
                    break;
                }
                default:{
                    PrivateCounters[i] += cmd.val*((cmd.opcode=='+')?1:-1);
                    R();
                    PrivateCounters[i] -= cmd.val*((cmd.opcode=='+')?1:-1);
                    break;
                }
            }
            ProgramCounters[i]--; 
        }

    if(finished)
        bestVal = min(bestVal, globalCounter);
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t;
    cin >> t;
    while(t--){
        cin >> n;

        Programs.resize(n);
        for(vector<Cmd>& program : Programs){
            int l;
            cin >> l;
            program.resize(l);
            for(Cmd& cmd : program){
                cin >> cmd.opcode;
                if(cmd.opcode=='+' || cmd.opcode=='-')
                    cin >> cmd.val;
            }
        }

        ProgramCounters.clear();
        ProgramCounters.resize(n, 0);
        PrivateCounters.clear();
        PrivateCounters.resize(n, 0);
        globalCounter=0;
        bestVal=numeric_limits<long long>::max();

        R();
        cout << bestVal << "\n";
    }

    return 0;
}