#include <bits/stdc++.h>
using namespace std;
struct Mystack {
  stack<int> s;
  stack<int> Maxs;
  stack<int> Mins;
  int allOpen = 0;
  int cnt = 0;
  void push(int x) {
    s.push(x);
    if (x == 1) allOpen++;
    cnt += x;
    Mins.push(Mins.size() ? min(Mins.top(), cnt) : cnt);
    Maxs.push(Maxs.size() ? max(Maxs.top(), cnt) : cnt);
  }
  void pop() {
    if (s.top() == 1) allOpen--;
    cnt -= s.top();
    s.pop();
    Mins.pop();
    Maxs.pop();
  }
  int top() { return s.top(); }
  bool isCorrect() { return (!Mins.size() || Mins.top() >= 0); }
  int depth() { return Maxs.size() ? Maxs.top() : 0; }
};
int main() {
  Mystack l, r;
  int n, pos = 0;
  string s;
  cin >> n >> s;
  l.push(0);
  for (int i = 0; i < n; i++) {
    r.push(0);
  }
  for (int i = 0; i < n; i++) {
    if (s[i] == 'L') {
      if (pos > 0) {
        pos--;
        r.push(-l.top());
        l.pop();
      }
    } else if (s[i] == 'R') {
      pos++;
      l.push(-r.top());
      r.pop();
    } else if (s[i] == '(') {
      l.pop();
      l.push(1);
    } else if (s[i] == ')') {
      l.pop();
      l.push(-1);
    } else {
      l.pop();
      l.push(0);
    }
    if (l.isCorrect() && r.isCorrect() && l.cnt == r.cnt) {
      cout << max(max(l.depth(), r.depth()), l.cnt) << " ";
    } else {
      cout << -1 << " ";
    }
  }
}
