#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5 + 10;
const int INF = 1e9;
int n, ans, ansl, ansr;
char s[maxn];
int a[maxn];
struct Node {
  int pre, min, cnt, id;
  Node() {
    pre = cnt = id = 0;
    min = INF;
  }
  Node(int _pre, int _min, int _cnt, int _id)
      : pre(_pre), min(_min), cnt(_cnt), id(_id) {}
} b[maxn], pre[maxn], suf[maxn], tmppre[maxn], tmpsuf[maxn];
bool cmpl(const Node& a, const Node& b) {
  return a.min - a.pre < b.min - b.pre;
}
bool cmpr(const Node& a, const Node& b) { return a.min < b.min; }
void cans(int cur, int l, int r) {
  if (ans < cur) ans = cur, ansl = l, ansr = r;
}
Node merge(const Node& a, const Node& b) {
  Node ret;
  ret.pre = a.pre + b.pre;
  if (a.min < b.min + a.pre) {
    ret.min = a.min;
    ret.cnt = a.cnt;
  } else if (a.min == b.min + a.pre) {
    ret.min = a.min;
    ret.cnt = a.cnt + b.cnt;
  } else {
    ret.min = b.min + a.pre;
    ret.cnt = b.cnt;
  }
  return ret;
}
Node rev(Node a) {
  a.pre = -a.pre;
  a.min = -a.min;
  return a;
}
vector<Node> get(int l, int r, int k) {
  vector<Node> ret;
  tmppre[l - 1] = Node();
  for (int i = l; i <= r; ++i) tmppre[i] = merge(tmppre[i - 1], b[i]);
  tmpsuf[r + 1] = Node();
  for (int i = r; i >= l; --i) tmpsuf[i] = merge(b[i], tmpsuf[i + 1]);
  for (int i = l; i <= r; ++i)
    if (a[i] == k) {
      ret.push_back(merge(merge(tmppre[i - 1], rev(b[i])), tmpsuf[i + 1]));
      ret.back().id = b[i].id;
    }
  return ret;
}
vector<Node> uniql(vector<Node> a) {
  vector<Node> ret;
  for (auto v : a) {
    if (ret.empty() || ret.back().min - ret.back().pre != v.min - v.pre)
      ret.push_back(v);
    else if (ret.back().cnt < v.cnt)
      ret.back() = v;
  }
  return ret;
}
vector<Node> uniqr(vector<Node> a) {
  vector<Node> ret;
  for (auto v : a) {
    if (ret.empty() || ret.back().min != v.min)
      ret.push_back(v);
    else if (ret.back().cnt < v.cnt)
      ret.back() = v;
  }
  return ret;
}
void calc(vector<Node> lv, vector<Node> rv, Node L, Node R, bool debug) {
  int id;
  for (auto& v : lv) id = v.id, v = merge(L, v), v.id = id;
  for (auto& v : rv) id = v.id, v = merge(v, R), v.id = id;
  sort(lv.begin(), lv.end(), cmpl);
  sort(rv.begin(), rv.end(), cmpr);
  lv = uniql(lv);
  rv = uniqr(rv);
  int l = 0;
  for (int i = 0; i < rv.size(); ++i) {
    while (l < lv.size() && lv[l].min <= lv[l].pre + rv[i].min) {
      if (lv[l].min < lv[l].pre + rv[i].min)
        cans(lv[l].cnt, lv[l].id, rv[i].id);
      else
        cans(lv[l].cnt + rv[i].cnt, lv[l].id, rv[i].id);
      ++l;
    }
    if (l < lv.size()) cans(rv[i].cnt, lv[l].id, rv[i].id);
  }
}
void solve(int l, int r) {
  if (l == r) return;
  int mid = l + r >> 1;
  calc(get(l, mid, 1), get(mid + 1, r, -1), pre[l - 1], suf[r + 1], 0);
  calc(get(l, mid, -1), get(mid + 1, r, 1), pre[l - 1], suf[r + 1], 0);
  solve(l, mid);
  solve(mid + 1, r);
}
int main() {
  scanf("%d", &n);
  scanf("%s", s + 1);
  int sum = 0;
  for (int i = 1; i <= n; ++i) {
    a[i] = s[i] == '(' ? 1 : -1;
    b[i] = Node(a[i], a[i], 1, i);
    sum += a[i];
  }
  if (sum) {
    puts("0");
    puts("1 1");
    return 0;
  }
  for (int i = 1; i <= n; ++i) pre[i] = merge(pre[i - 1], b[i]);
  for (int i = n; i >= 1; --i) suf[i] = merge(b[i], suf[i + 1]);
  ans = pre[n].cnt;
  ansl = ansr = 1;
  solve(1, n);
  printf("%d\n", ans);
  printf("%d %d\n", ansl, ansr);
  return 0;
}
