#include <bits/stdc++.h>
int pair_min(std::pair<int, int> p) { return std::min(p.first, p.second); }
int pair_max(std::pair<int, int> p) { return std::max(p.first, p.second); }
class segment_tree {
 public:
  std::vector<std::pair<int, int>> arr_min;
  std::vector<std::pair<int, int>> arr_max;
  int ii, val;
  segment_tree() {
    arr_min.resize((10e5 * 3) * 4, std::make_pair(0, 0));
    arr_max.resize((10e5 * 3) * 4, std::make_pair(0, 0));
  }
  int min() { return arr_min[0].first; }
  int max() { return arr_max[0].first; }
  void update(int i, int val) {
    this->ii = i;
    this->val = val;
    update_min(0, (10e5 * 3) - 1, 0);
    update_max(0, (10e5 * 3) - 1, 0);
  }
  std::pair<int, int> update_min(int a, int b, int i) {
    if (ii < a || b < ii) {
      return arr_min[i];
    }
    if (a == b) {
      return arr_min[i] = std::make_pair(std::min(val, 0), val);
    }
    int mid = (a + b) / 2;
    std::pair<int, int> p1 = update_min(a, mid, i * 2 + 1);
    std::pair<int, int> p2 = update_min(mid + 1, b, i * 2 + 2);
    arr_min[i].first =
        std::min(pair_min(p1), std::min(p1.second, p1.second + p2.first));
    arr_min[i].second = p1.second + p2.second;
    return arr_min[i];
  }
  std::pair<int, int> update_max(int a, int b, int i) {
    if (ii < a || b < ii) {
      return arr_max[i];
    }
    if (a == b) {
      return arr_max[i] = std::make_pair(std::max(val, 0), val);
    }
    int mid = (a + b) / 2;
    std::pair<int, int> p1 = update_max(a, mid, i * 2 + 1);
    std::pair<int, int> p2 = update_max(mid + 1, b, i * 2 + 2);
    arr_max[i].first =
        std::max(pair_max(p1), std::max(p1.second, p1.second + p2.first));
    arr_max[i].second = p1.second + p2.second;
    return arr_max[i];
  }
};
int main() {
  int n;
  std::cin >> n;
  std::string str;
  std::cin >> str;
  segment_tree seg;
  int i = 0;
  std::string vals((10e5 * 3), ' ');
  int tot = 0;
  for (auto ch : str) {
    switch (ch) {
      case 'R':
        i++;
        break;
      case 'L':
        i = std::max(i - 1, 0);
        break;
      case '(':
        tot -= (vals[i] == ')' ? -1 : vals[i] == '(' ? 1 : 0);
        tot++;
        vals[i] = '(';
        seg.update(i, 1);
        break;
      case ')':
        tot -= (vals[i] == ')' ? -1 : vals[i] == '(' ? 1 : 0);
        tot--;
        vals[i] = ')';
        seg.update(i, -1);
        break;
      default:
        tot -= (vals[i] == ')' ? -1 : vals[i] == '(' ? 1 : 0);
        vals[i] = ' ';
        seg.update(i, 0);
        break;
    }
    int num;
    if (tot != 0 || seg.min() < 0) {
      num = -1;
    } else {
      num = seg.max();
    }
    printf("%d ", num);
  }
  puts("");
  return 0;
}
