#include <bits/stdc++.h>
using namespace std;
char s[1000005];
struct st {
  struct node {
    int L, sum;
  };
  node get(node a, node b) {
    node ans;
    ans.L = max(a.L, a.sum + b.L);
    ans.sum = a.sum + b.sum;
    return ans;
  }
  node st[4000005];
  void update(int n, int s, int e, int idx, int v) {
    if (s == e) {
      st[n].L = max(0, v);
      st[n].sum = v;
    } else {
      int mid = (s + e) / 2;
      if (idx <= mid)
        update(n + n, s, mid, idx, v);
      else
        update(n + n + 1, mid + 1, e, idx, v);
      st[n] = get(st[n + n], st[n + n + 1]);
    }
  }
  node query(int n, int s, int e, int l, int r) {
    if (s > r || l > e) {
      node ans;
      ans.L = 0;
      ans.sum = 0;
      return ans;
    }
    if (l <= s && e <= r) return st[n];
    int mid = (s + e) / 2;
    node q1 = query(n + n, s, mid, l, r);
    node q2 = query(n + n + 1, mid + 1, e, l, r);
    return get(q1, q2);
  }
} st1, st2;
int main() {
  int n;
  scanf("%d", &n);
  scanf("%s", s + 1);
  int cur = 1;
  for (int i = 1; i <= n; i++) {
    if (s[i] == 'R')
      cur++;
    else if (s[i] == 'L')
      cur--;
    else {
      int add = 0;
      if (s[i] == '(')
        add = 1;
      else if (s[i] == ')')
        add = -1;
      st1.update(1, 1, n, cur, add);
      st2.update(1, 1, n, cur, -add);
    }
    cur = max(cur, 1);
    if (st2.query(1, 1, n, 1, n).L > 0 || st1.query(1, 1, n, 1, n).sum != 0)
      printf("-1 ");
    else
      printf("%d ", st1.query(1, 1, n, 1, n).L);
  }
}
