This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
int dp[305][305][305];
const int MOD = 1e9 + 7;
int rek(int at, int open, int closed){
    if(at == 0){
        if(closed == 0){
            return 1;
        }
        return 0;
    }
    if(dp[at][open][closed] != -1){
        return dp[at][open][closed];
    }
    int ret = 0;
    ret += rek(at - 1, open + 2, closed + 1);
    if(open > 0){
        ret += rek(at - 1, open - 1, max(closed - 2, 0));
    }
    return dp[at][open][closed] = ret % MOD;
}
void solve(string s){
    string ret = s;
    for(int i = 0; i < s.size(); i ++){
        ret[i] = '?';
    }
    stack<int> st;
    int cnt = 0;
    for(int i = 0; i < (int)s.size(); i ++){
        if(s[i] == '('){
            ++cnt;
            ret[i] = 'G';
        }
        else{
            if(cnt == 0){
                if(st.empty()) {
                    cout << "impossible\n";
                    return;
                }
                ret[st.top()] = 'R';
                ret[i] = 'B';
                st.pop();
            }
            else{
                cnt --;
                ret[i] = 'G';
                st.push(i);
            }
        }
    }
    stack<int> st2;
    cnt = 0;
    for(int i = (int)s.size() - 1; i >= 0; i --){
        if(s[i] == ')'){
            ++cnt;
        }
        else{
            if(cnt == 0){
                if(st2.empty()) {
                    cout << "impossible\n";
                    return;
                }
                ret[st2.top()] = 'B';
                ret[i] = 'R';
                st2.pop();
            }
            else{
                cnt --;
                st2.push(i);
            }
        }
    }
    cout << ret << endl;
}
int main()
{
    ios_base::sync_with_stdio(false);
    int t_case;
    cin >> t_case;
    if(t_case == 1){
        int t;
        cin >> t;
        string s;
        while(t --){
            cin >> s;
            solve(s);
        }
    }
    else if(t_case == 2){
        int t;
        cin >> t;
        memset(dp, -1, sizeof dp);
        while(t --){
            int n;
            cin >> n;
            cout << rek(n, 0, 0) << endl;
        }
    }
    return 0;
}
Compilation message (stderr)
parentrises.cpp: In function 'void solve(std::__cxx11::string)':
parentrises.cpp:25:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < s.size(); i ++){
                    ~~^~~~~~~~~~| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |