#include <bits/stdc++.h>
using namespace std;
template <typename T>
class SegTreeAddMinMax {
  struct Node {
    T x, y, lazy;
    Node() : x(), y(), lazy() {}
    void add(T by) {
      x += by;
      y += by;
      lazy += by;
    }
  };
  inline int L(int v) { return v << 1; }
  inline int R(int v) { return L(v) + 1; }
  void push(int v) {
    if (tree[v].lazy) {
      tree[L(v)].add(tree[v].lazy);
      tree[R(v)].add(tree[v].lazy);
      tree[v].lazy = 0;
    }
  }
  int n;
  const T INF;
  vector<Node> tree;
  T minq(int ql, int qr, int v, int l, int r) {
    if (l > qr || ql > r) return INF;
    if (ql <= l && r <= qr) return tree[v].y;
    push(v);
    int m = (l + r) >> 1;
    return min(minq(ql, qr, L(v), l, m), minq(ql, qr, R(v), m + 1, r));
  }
  T maxq(int ql, int qr, int v, int l, int r) {
    if (l > qr || ql > r) return -INF;
    if (ql <= l && r <= qr) return tree[v].x;
    push(v);
    int m = (l + r) >> 1;
    return max(maxq(ql, qr, L(v), l, m), maxq(ql, qr, R(v), m + 1, r));
  }
  void add(int ql, int qr, T by, int v, int l, int r) {
    if (l > qr || ql > r) return;
    if (ql <= l && r <= qr) {
      tree[v].add(by);
    } else {
      push(v);
      int m = (l + r) >> 1;
      add(ql, qr, by, L(v), l, m);
      add(ql, qr, by, R(v), m + 1, r);
      tree[v].x = max(tree[L(v)].x, tree[R(v)].x);
      tree[v].y = min(tree[L(v)].y, tree[R(v)].y);
    }
  }

 public:
  SegTreeAddMinMax(int n) : n(n), INF(numeric_limits<T>::max() >> 1) {
    tree.resize(n << 2);
  }
  T minq(int ql, int qr) { return minq(ql, qr, 1, 0, n - 1); }
  T maxq(int ql, int qr) { return maxq(ql, qr, 1, 0, n - 1); }
  void add(int ql, int qr, T by) { add(ql, qr, by, 1, 0, n - 1); }
};
constexpr int N = 1000005;
int a[N];
int main() {
  ios::sync_with_stdio();
  cin.tie(0);
  SegTreeAddMinMax<int> st(N);
  int n;
  cin >> n;
  string s;
  cin >> s;
  int i = 1;
  int tot = 0;
  for (char c : s) {
    int d = -a[i];
    if (c == 'R') {
      i += 1;
      d = 0;
    } else if (c == 'L') {
      i = max(1, i - 1);
      d = 0;
    } else if (c == '(')
      d += 1, a[i] = 1;
    else if (c == ')')
      d += -1, a[i] = -1;
    else
      a[i] = 0;
    tot += d;
    if (d) st.add(i, N - 1, d);
    if (tot != 0 || st.minq(1, N - 1) < 0)
      cout << -1 << ' ';
    else
      cout << st.maxq(1, N - 1) << ' ';
  }
  cout << '\n';
}
