Problem:
B: 括弧を語る数 / Parentheses Number

問題

以下のように 正しい括弧列 を定めます。

空文字列は正しい括弧列である

正しい括弧列 S に対して ( S ) は正しい括弧列である

正しい括弧列 S, T に対して ST は正しい括弧列である

ここで、正しい括弧列に対して以下のような規則で順列を対応付けます。

i 番目の閉じ括弧が j 番目の開き括弧に対応しているとき、 数列の i 番目の値は j である。

長さ n の順列 P = ( p_1, p_2, $\ldots$, p_n ) が与えられるので、 それに対応する括弧列を復元してください。

ただし、順列に対応する括弧列が存在しない場合は :( を出力してください。

入力形式

n
p_1 p_2 $\ldots$ p_n

1 行目に順列の項数 n が与えられる。

2 行目に順列 p_1, p_2, $\ldots$, p_i, $\ldots$, p_n が空白区切りで与えられる。

制約

1 \leq n \leq 10^5

1 \leq p_i \leq n

入力は全て整数である。

P = ( p_1, p_2, $\ldots$, p_n ) は順列である。

出力形式

順列に対応する括弧列を出力してください。

そのような括弧列が存在しない場合は :( を出力してください。

入力例1

2
2 1

出力例1

(())

入力例2

10
1 2 3 4 5 6 7 8 9 10

出力例2

()()()()()()()()()()

入力例3

3
3 1 2

出力例3

:(

Solution in C++14 (judge verdict: Accepted)

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> q(n);
    for (int i = 0; i < n; ++i) {
        int p;
        cin >> p;
        q[p - 1] = i;
    }

    string ans;
    stack<int> st;
    int count_closing_parenthesis = 0;
    for (int i = 0; i < n; ++i) {
        ans += "(";
        st.push(q[i]);

        while (st.size() && count_closing_parenthesis == st.top()) {
            ans += ")";
            st.pop();
            count_closing_parenthesis++;
        }
    }
    if (!st.empty()) {
        cout << ":(" << endl;
    } else {
        cout << ans << endl;
    }
    return 0;
}