fork download
#include <cstdio>
#include <cstring>
#include <algorithm>
#pragma GCC diagnostic ignored "-Wlong-long"
using namespace std;
int n;
char s[500001];
int lval[500000];
int rval[500000];

bool is_possible() {
    int l = 0, r = 0; // [l, r]
    for(int i = 0; i < n; i++) {
        switch(s[i]) {
        case '(': l++; r++; break;
        case ')': l--; r--; break;
        case '?': l--; r++; break;
        }
        if(l < 0) l += 2;
        if(l > r) return false;
    }
    return l == 0;
}

struct Cmp {
    bool operator() (int lhs, int rhs) {
         return (long long) rval[lhs] - lval[lhs] < (long long) rval[rhs] - lval[rhs];
    }
};

int vec[500000];

long long solve() {
    int m = 0;
    for(int i = 0; i < n; i++)
        if(s[i] == '?')
            vec[m++] = i;
    sort(vec, vec + m, Cmp());
    long long val = 0;
    for(int index = 0; index < m; index++) {
        int i = vec[index];
        s[i] = ')';
        if(is_possible()) {
            val += rval[i];
        } else {
            s[i] = '(';
            val += lval[i];
        }
    }
    return val;
}

int main(){
    int t;
    scanf("%d", &t);
    while(t--) {
        scanf("%s", s);
        n = strlen(s);
        for(int i = 0; i < n; i++)
            if(s[i] == '?')
                scanf("%d %d", lval + i, rval + i);
        if(is_possible()) {
            #pragma GCC diagnostic push
            #pragma GCC diagnostic ignored "-Wformat"
            printf("%lld\n", solve());
            #pragma GCC diagnostic pop
        } else {
            puts("IMBA");
        }
    }
}
Success #stdin #stdout 0s 9696KB
stdin
4
(())
(??)
1 10
10 100
?????)))))
2 1
2 1
2 1
2 1
2 1
(((((?
2147483647 -2147483648
stdout
0
20
10
IMBA