#include using namespace std; using ll = long long; const ll INF = 1e18; #define sz(x) (int)(x).size() #define rep(i, n) for (int i = 0; i < n; i++) #define FOR(i, l, r) for(int i = l; i < r; i++) #define all(v) (v).begin(), (v).end() template ostream &operator<< (ostream& os, const vector &v){ rep(i, sz(v)) { os << v[i]; if (i < sz(v)-1)os << " "; } return os; } void out(){ cout << endl; } template void out(Head h, Tail ...t) { cout << h << " "; out(t...); } const int inf = 1e9; const ll mod = 998244353; using pii = pair; #include #include using mint = atcoder::modint998244353; void solve() { int n;cin >> n; string S;cin >> S; vector a(n+1); rep(i, n) cin >> a[i+1]; vector p(n + 1, -1); stack sk;sk.push(0); int t = 1; rep(i, n * 2) { if (S[i] == '(') { p[t] = sk.top(); sk.push(t++); } else { sk.pop(); } } // FOR(i, 1, n+1) cerr << p[i] << " "; // cerr << endl; vector cnt(n+1, 1);cnt[0] = 0; vector sum(n+1, 0); FOR(i, 1, n + 1) sum[i] = a[i]; vector ans(n + 1, 0); FOR(i, 1, n + 1) ans[i] = a[i]; auto cmp = [&](int a, int b) { if(cnt[a] * sum[b] == cnt[b] * sum[a]) return a < b; else return (cnt[a] * sum[b] < cnt[b] * sum[a]); }; set pq(cmp); FOR(i, 1, n + 1) { pq.insert(i); } // out(pq.size()); atcoder::dsu dsu(n+1); vector mindex(n+1);iota(all(mindex), 0); int c = pq.size(); rep(_, n) { // assert(!pq.empty());out(pq.size(), c); auto x = pq.begin(); int i = *x, j = dsu.leader(p[mindex[i]]); // assert(!dsu.same(i, j)); int nxt = dsu.merge(i, j); pq.erase(i),c--;if (mindex[j] > 0)pq.erase(j),c--; // out(i, j, nxt); mindex[nxt] = min(mindex[i], mindex[j]); ans[nxt] = ans[i] + ans[j] + cnt[j] * sum[i]; sum[nxt] = sum[i] + sum[j]; cnt[nxt] = cnt[i] + cnt[j]; if (mindex[nxt] > 0) pq.insert(nxt),c++; } // out(ans); ll s = sum[dsu.leader(0)]; cout << ans[dsu.leader(0)]<< endl; } int main() { std::cin.tie(0)->sync_with_stdio(0); // int T;cin >> T; int T = 1; while(T--) solve(); }