#include <bits/stdc++.h>
using namespace std;
const int maxn = 6e5 + 5;
const int INF = 0x3f3f3f3f;
int N, n;
struct Tree {
  int mi, lz, pos, cnt;
} T[maxn << 2], te;
void build(int rt, int l, int r) {
  T[rt].lz = T[rt].mi = 0;
  T[rt].pos = r;
  T[rt].cnt = r - l + 1;
  if (l == r) return;
  build((rt << 1), l, ((l + r) >> 1)),
      build((rt << 1 | 1), ((l + r) >> 1) + 1, r);
}
void pushup(int rt) {
  if (T[(rt << 1)].mi == T[(rt << 1 | 1)].mi) {
    T[rt].mi = T[(rt << 1 | 1)].mi;
    T[rt].pos = T[(rt << 1 | 1)].pos;
    T[rt].cnt = T[(rt << 1)].cnt + T[(rt << 1 | 1)].cnt;
  } else {
    int lz = T[rt].lz;
    if (T[(rt << 1)].mi > T[(rt << 1 | 1)].mi) {
      T[rt] = T[(rt << 1 | 1)];
    } else {
      T[rt] = T[(rt << 1)];
    }
    T[rt].lz = lz;
  }
}
void pushdown(int rt) {
  if (T[rt].lz) {
    T[(rt << 1)].lz += T[rt].lz, T[(rt << 1)].mi += T[rt].lz;
    T[(rt << 1 | 1)].lz += T[rt].lz, T[(rt << 1 | 1)].mi += T[rt].lz;
    T[rt].lz = 0;
  }
}
void update(int rt, int l, int r, int L, int R, int v) {
  if (L <= l && r <= R) {
    T[rt].lz += v;
    T[rt].mi += v;
    return;
  }
  pushdown(rt);
  if (L <= ((l + r) >> 1)) update((rt << 1), l, ((l + r) >> 1), L, R, v);
  if (R > ((l + r) >> 1)) update((rt << 1 | 1), ((l + r) >> 1) + 1, r, L, R, v);
  pushup(rt);
}
void query(int rt, int l, int r, int L, int R) {
  if (L <= l && r <= R) {
    if (T[rt].mi < te.mi) {
      te = T[rt];
    } else if (T[rt].mi == te.mi) {
      te.pos = max(te.pos, T[rt].pos);
      te.cnt += T[rt].cnt;
    }
    return;
  }
  pushdown(rt);
  if (L <= ((l + r) >> 1)) query((rt << 1), l, ((l + r) >> 1), L, R);
  if (R > ((l + r) >> 1)) query((rt << 1 | 1), ((l + r) >> 1) + 1, r, L, R);
  pushup(rt);
}
Tree query(int L, int R) {
  te.mi = INF;
  query(1, 1, N, L, R);
  return te;
}
char s[maxn];
int a[maxn];
int main() {
  scanf("%d", &n);
  scanf("%s", s + 1);
  N = 2 * n;
  build(1, 1, N);
  for (int i = 1; i <= n; i++) {
    a[i] = a[n + i] = (s[i] == '(' ? 1 : -1);
    update(1, 1, N, i, N, a[i]);
    update(1, 1, N, i + n, N, a[n + i]);
  }
  if (query(n, n).mi != 0) {
    puts("0\n1 1\n");
    return 0;
  }
  int ans = 0, l = 1, r = 1;
  for (int i = 1; i <= n; i++) {
    Tree temp = query(i, i + n - 1);
    if (a[i] == 1) {
      if (temp.mi == 0) {
        if (temp.cnt > ans) ans = temp.cnt, l = r = 1;
      }
    } else {
      if (temp.mi == -1) {
        update(1, 1, N, i, temp.pos, 2);
        Tree temp2 = query(i, i + n - 1);
        if (temp2.mi == 0 && temp2.cnt > ans)
          ans = temp2.cnt, l = i, r = temp.pos + 1;
        update(1, 1, N, i, temp.pos, -2);
      } else if (temp.mi == -2) {
        Tree temp2 = query(temp.pos + 1, i + n - 1);
        if (temp2.mi != -1) continue;
        if (temp2.pos + 1 > N) continue;
        Tree temp3 = query(temp2.pos + 1, i + n - 1);
        if (temp3.mi == 0 && temp3.cnt + temp.cnt > ans)
          ans = temp3.cnt + temp.cnt, l = i, r = temp2.pos + 1;
      }
    }
    update(1, 1, N, i, N, -a[i]);
  }
  if (l > n) l -= n;
  if (r > n) r -= n;
  printf("%d\n%d %d\n", ans, l, r);
}
