#include <bits/stdc++.h>
using namespace std;
const int MAXN = 3e5;
int n, a[MAXN + 5];
char s[MAXN + 5];
struct SegmentTree {
  int val[MAXN * 4 + 5], tag[MAXN * 4 + 5];
  void push_up(int p) { val[p] = min(val[p << 1], val[p << 1 | 1]); }
  void push_down(int p) {
    if (tag[p]) {
      val[p << 1] += tag[p];
      tag[p << 1] += tag[p];
      val[p << 1 | 1] += tag[p];
      tag[p << 1 | 1] += tag[p];
      tag[p] = 0;
    }
  }
  void build(int p, int l, int r) {
    if (l == r) {
      val[p] = a[l];
      return;
    }
    int mid = (l + r) >> 1;
    build(p << 1, l, mid);
    build(p << 1 | 1, mid + 1, r);
    push_up(p);
  }
  void modify_PointChange(int p, int l, int r, int pos, int v) {
    if (l == r) {
      val[p] = v;
      return;
    }
    push_down(p);
    int mid = (l + r) >> 1;
    if (pos <= mid)
      modify_PointChange(p << 1, l, mid, pos, v);
    else
      modify_PointChange(p << 1 | 1, mid + 1, r, pos, v);
    push_up(p);
  }
  void modify_RangeAdd(int p, int l, int r, int ql, int qr, int v) {
    if (ql <= l && qr >= r) {
      val[p] += v;
      tag[p] += v;
      return;
    }
    push_down(p);
    int mid = (l + r) >> 1;
    if (ql <= mid) modify_RangeAdd(p << 1, l, mid, ql, qr, v);
    if (qr > mid) modify_RangeAdd(p << 1 | 1, mid + 1, r, ql, qr, v);
    push_up(p);
  }
  SegmentTree() {}
} T;
int main() {
  scanf("%d%s", &n, s + 1);
  int cnt_left = 0, cnt_right = 0;
  for (int i = 1; i <= n; ++i)
    cnt_left += (s[i] == '('), cnt_right += (s[i] == ')');
  if (cnt_left != cnt_right) {
    printf("%d\n%d %d\n", 0, 1, 1);
    return 0;
  }
  for (int i = 1; i <= n; ++i) a[i] = a[i - 1] + (s[i] == '(' ? 1 : -1);
  T.build(1, 1, n);
  int p = -1;
  for (int i = 0; i < n; ++i) {
    assert(T.val[1] <= 0);
    if (T.val[1] == 0) {
      p = i;
      break;
    }
    if (i != n - 1) {
      T.modify_PointChange(1, 1, n, n - i, 0);
      T.modify_RangeAdd(1, 1, n, n - i, n, (s[n - i] == '(' ? 1 : -1));
      T.modify_RangeAdd(1, 1, n, 1, n - i - 1, (s[n - i] == '(' ? 1 : -1));
    }
  }
  assert(p != -1);
  int x = 1, y = 1, ans0 = 0, ans1 = 0, ans2 = -MAXN * 2, cur = 0, x2 = 1,
      y2 = 1;
  for (int ii = 1, aa = 0, st = (p ? n - p + 1 : 1), stii = 1; ii <= n; ++ii) {
    int i = n - p + ii;
    if (i > n) i -= n;
    aa += (s[i] == '(' ? 1 : -1);
    if (!aa) {
      ans0++;
      if (cur > ans1) ans1 = cur, x = st, y = i;
      int tmpcur = 0;
      for (int jj = stii + 1, aaa = 0,
               sst = (st + 1 <= n ? st + 1 : st + 1 - n);
           jj <= ii - 1; ++jj) {
        int j = n - p + jj;
        if (j > n) j -= n;
        aaa += (s[j] == '(' ? 1 : -1);
        if (!aaa) {
          if (tmpcur - 1 > ans2) ans2 = tmpcur - 1, x2 = sst, y2 = j;
          sst = j + 1;
          if (sst > n) sst -= n;
          tmpcur = 0;
        }
        if (aaa == 1) tmpcur++;
      }
      stii = ii + 1;
      st = i + 1;
      if (st > n) st -= n;
      cur = 0;
    }
    if (aa == 1) cur++;
  }
  ans2 = ans0 + ans2 + 1;
  if (ans0 >= ans1 && ans0 >= ans2) {
    printf("%d\n%d %d\n", ans0, 1, 1);
  } else if (ans1 >= ans0 && ans1 >= ans2) {
    printf("%d\n%d %d\n", ans1, x, y);
  } else if (ans2 >= ans0 && ans2 >= ans1) {
    printf("%d\n%d %d\n", ans2, x2, y2);
  }
  return 0;
}
