#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using P = pair<ll, ll>;
template <class T>
using V = vector<T>;
constexpr ll INF = (1LL << 30) - 1LL;
constexpr ll MOD = 998244353LL;
constexpr int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
template <class T>
void chmin(T &a, T b) {
  a = min(a, b);
}
template <class T>
void chmax(T &a, T b) {
  a = max(a, b);
}
void debug() { cerr << "ok" << endl; }
template <class T>
void printv(const vector<T> &v) {
  for (int i = 0; i < v.size(); i++)
    cout << v[i] << (i + 1 == v.size() ? '\n' : ' ');
}
template <class T, class E>
struct Segtree {
  inline void act(E &a, const E &b) { a += b; }
  inline void comb(T &a, const E &b) { a += b; }
  int n;
  T et;
  E ee;
  vector<T> dat, dat2;
  vector<E> laz;
  Segtree(int n_, T et, E ee) : et(et), ee(ee) {
    n = 1;
    while (n < n_) {
      n <<= 1;
    }
    dat.resize(2 * n, 0);
    dat2.resize(2 * n, 0);
    laz.resize(2 * n, ee);
  }
  inline void eval(int k) {
    if (laz[k] == ee) {
      return;
    }
    comb(dat[k], laz[k]);
    dat2[k] += laz[k];
    if (k < n) {
      act(laz[k << 1], laz[k]);
      act(laz[k << 1 | 1], laz[k]);
    }
    laz[k] = ee;
  }
  void upd(const int &a, const int &b, const E &x, int k, int l, int r) {
    eval(k);
    if (b <= l || r <= a) {
      return;
    }
    if (a <= l && r <= b) {
      act(laz[k], x);
      eval(k);
      return;
    }
    upd(a, b, x, k << 1, l, (l + r) >> 1);
    upd(a, b, x, k << 1 | 1, (l + r) >> 1, r);
    dat[k] = min(dat[k << 1], dat[k << 1 | 1]);
    dat2[k] = max(dat2[k << 1], dat2[k << 1 | 1]);
  }
  inline void upd(const int &a, const int &b, const E &x) {
    if (a >= b) {
      return;
    }
    upd(a, b, x, 1, 0, n);
  }
  T getmin() {
    eval(1);
    return dat[1];
  }
  T getmax() {
    eval(1);
    return dat2[1];
  }
};
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n;
  cin >> n;
  string s;
  cin >> s;
  Segtree<int, int> seg(n + 10, 0, 0);
  int pos = 0;
  string t;
  t.push_back(' ');
  int co = 0;
  V<int> v(n);
  for (int i = 0; i < n; i++) {
    if (s[i] == 'L') {
      pos = max(0, pos - 1);
      if (i > 0) {
        v[i] = v[i - 1];
      } else {
        v[i] = 0;
      }
    } else if (s[i] == 'R') {
      if (pos + 1 >= t.length()) {
        t.push_back(' ');
      }
      if (i > 0) {
        v[i] = v[i - 1];
      } else {
        v[i] = 0;
      }
      pos++;
    } else {
      int a = 0;
      if (t[pos] == '(') {
        --a;
      } else if (t[pos] == ')') {
        a++;
      }
      t[pos] = s[i];
      if (s[i] == '(') {
        a++;
      } else if (s[i] == ')') {
        --a;
      }
      seg.upd(pos + 1, n + 5, a);
      co += a;
      if (seg.getmin() < 0 || co != 0) {
        v[i] = -1;
      } else {
        v[i] = seg.getmax();
      }
    }
  }
  printv(v);
}
