Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // Created by Ильдар Ялалов on 14.01.2020.
- //
- //#pragma GCC optimize("Ofast")
- //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- const int inf_int = 1e9 + 100;
- const ll inf_ll = 1e18;
- typedef pair<int, int> pii;
- typedef pair<ll, ll> pll;
- typedef double dbl;
- typedef unsigned int uint;
- #define pb push_back
- #define eb emplace_back
- const double pi = 3.1415926535898;
- #define dout if(debug) cout
- #define fi first
- #define se second
- #define sp setprecision
- #define sz(a) (int(a.size()))
- #define mp make_pair
- #define all(a) a.begin(),a.end()
- #ifdef zxc
- #include "debug.h"
- #define debug(...) cout << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
- #else
- #define debug(...) 42
- #endif
- bool debug = 0;
- const int MAXN = (4e5) + 100;
- const int LOG = 21;
- const int mod = 1e9 + 7;
- const int MX = (3e7 + 100);
- int a[MAXN];
- struct vertex {
- int pref;
- int suf;
- int total;
- vertex() {
- }
- };
- #define left v<<1,tl,tm
- #define right v<<1|1,tm+1,tr
- vertex t[4 * MAXN];
- void upd(int v) {
- int l = v << 1;
- int r = v << 1 | 1;
- t[v].total = t[l].total + t[r].total;
- t[v].suf = min(t[r].suf, t[l].suf + t[r].total);
- t[v].pref = min(t[l].pref, t[l].total + t[r].pref);
- }
- void build(int v, int tl, int tr) {
- if (tl == tr) {
- t[v].pref = 0;
- t[v].suf = 0;
- t[v].total = 1;
- } else {
- int tm = (tl + tr) >> 1;
- build(left);
- build(right);
- upd(v);
- }
- }
- void update(int v, int tl, int tr, int pos, bool open) {
- if (tl == tr) {
- if (open) {
- t[v].suf = -1;
- t[v].pref = -1;
- t[v].total = -1;
- } else {
- t[v].suf = 0;
- t[v].pref = 0;
- t[v].total = 1;
- }
- } else {
- int tm = (tl + tr) >> 1;
- if (pos <= tm) {
- update(left, pos, open);
- } else {
- update(right, pos, open);
- }
- upd(v);
- }
- }
- int used[MAXN];
- int sec[MAXN];
- int res[MAXN];
- void solve() {
- int n;
- cin >> n;
- for (int i = 1; i <= 2 * n; ++i) {
- cin >> a[i];
- }
- n = n * 2;
- build(1, 1, n);
- for (int i = 1; i <= n; ++i) {
- sec[a[i]] = i;
- }
- for (int i = 1; i <= n; ++i) {
- if (used[a[i]])
- continue;
- int r = sec[a[i]];
- used[a[i]] = 1;
- if (r == n)
- continue;
- update(1, 1, n, i, true);
- update(1, 1, n, r, true);
- res[i] = res[r] = 1;
- if (t[1].suf < 0) {
- update(1, 1, n, i, false);
- update(1, 1, n, r, false);
- res[i] = res[r] = 0;
- }
- }
- string ans = "";
- int cnt = 0;
- for(int i = 1;i<=n;++i){
- debug(res[i]);
- }
- for (int i = 1; i <= n; ++i) {
- if (res[i]) {
- cnt++;
- ans.pb('(');
- } else {
- cnt--;
- ans.pb(')');
- }
- if (cnt < 0) {
- cout << "(";
- return;
- }
- }
- if (cnt != 0) {
- cout << "(";
- } else {
- cout << ans << "\n";
- }
- }
- // CHECK LIMITS (n <= 10^5)
- // CHECK CORNER CASES ( n==1)
- signed main() {
- #ifdef zxc
- freopen("../input.txt", "r", stdin);
- // freopen("../output.txt", "w", stdout);
- #else
- #endif //zxc
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- cout.setf(ios::fixed);
- cout.precision(2);
- int t = 1;
- while (t--) {
- solve();
- }
- debug(1.0 * clock() / CLOCKS_PER_SEC);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement