#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int maxn = 1e6 + 10;
struct node {
  int l, r, max, tag, min;
} t[maxn * 4];
void up(node &p, node &l, node &r) {
  p.max = max(l.max, r.max);
  p.min = min(l.min, r.min);
}
void down(node &p, node &l, node &r) {
  l.max += p.tag;
  r.max += p.tag;
  l.min += p.tag;
  r.min += p.tag;
  l.tag += p.tag;
  r.tag += p.tag;
  p.tag = 0;
}
void build(int p, int l, int r) {
  t[p].l = l;
  t[p].r = r;
  if (l == r) {
    return;
  }
  int mid = l + r >> 1;
  build(p << 1, l, mid);
  build(p << 1 | 1, mid + 1, r);
}
void upd(int p, int l, int r, int k) {
  if (t[p].l >= l && t[p].r <= r) {
    t[p].max += k;
    t[p].min += k;
    t[p].tag += k;
    return;
  }
  int mid = t[p].l + t[p].r >> 1;
  down(t[p], t[p << 1 | 1], t[p << 1]);
  if (l <= mid) upd(p << 1, l, r, k);
  if (r > mid) upd(p << 1 | 1, l, r, k);
  up(t[p], t[p << 1], t[p << 1 | 1]);
}
int qy(int p, int k) {
  if (t[p].l == t[p].r) {
    return t[p].max;
  }
  int mid = t[p].l + t[p].r >> 1;
  down(t[p], t[p << 1], t[p << 1 | 1]);
  if (k <= mid) return qy(p << 1, k);
  return qy(p << 1 | 1, k);
}
char a[maxn];
char s[maxn];
int main() {
  int n;
  scanf("%d", &n);
  build(1, 0, n + 1);
  int now = 1;
  scanf("%s", s + 1);
  for (int i = 1; i <= n; i++) {
    switch (s[i]) {
      case 'R': {
        now++;
        break;
      }
      case 'L': {
        if (now > 1) now--;
        break;
      }
      default: {
        if (a[now] == '(') {
          upd(1, now, n + 1, -1);
        } else if (a[now] == ')') {
          upd(1, now, n + 1, 1);
        }
        if (s[i] == '(') {
          upd(1, now, n + 1, 1);
        } else if (s[i] == ')') {
          upd(1, now, n + 1, -1);
        }
        a[now] = s[i];
      }
    }
    if (qy(1, n + 1) || t[1].min < 0) {
      printf("-1 ");
      continue;
    }
    printf("%d ", t[1].max);
  }
}
