#include <bits/stdc++.h>
using namespace std;
using int64 = long long;
constexpr int DEBUG = 0;
template <typename T>
ostream& operator<<(ostream& s, const vector<T>& v) {
  int len = v.size();
  s << "[";
  for (int i = 0; i < len; i++) {
    if (i > 0) s << ", ";
    s << v[i];
  }
  s << "]";
  return s;
}
template <class T>
inline bool UpdateMin(T& a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
inline bool UpdateMax(T& a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <typename T>
vector<vector<T>> Make2DVector(int d1, int d2, T default_value) {
  return vector<vector<T>>(d1, vector<T>(d2, default_value));
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n;
  cin >> n;
  string s;
  cin >> s;
  vector<int> xs(n + 1);
  int x_min = 0;
  for (int i = 0; i < n; i++) {
    xs[i + 1] = xs[i] + ((s[i] == '(') ? 1 : -1);
    UpdateMin(x_min, xs[i + 1]);
  }
  if (DEBUG) cout << "xs: " << xs << endl;
  if (DEBUG) cout << "x_min: " << x_min << endl;
  if (xs[n] != 0) {
    cout << 0 << endl;
    cout << 1 << " " << 1 << endl;
    return 0;
  }
  int max_score = 0;
  for (int i = 1; i <= n; i++) {
    if (xs[i] == x_min) max_score++;
  }
  int max_score_l = 0;
  int max_score_r = 0;
  for (int new_min = x_min - 2; new_min <= x_min; new_min++) {
    auto dp1 = Make2DVector(n + 1, 3, -1);
    auto dp2 = Make2DVector(n + 1, 3, 0);
    dp1[0][0] = 0;
    for (int i = 0; i < n; i++) {
      for (int k = 0; k < 3; k++) {
        int new_x = xs[i + 1] + ((k == 1) ? -2 : 0);
        int delta = (new_x == new_min) ? 1 : 0;
        if (new_x < new_min) continue;
        if (dp1[i][k] >= 0) UpdateMax(dp1[i + 1][k], dp1[i][k] + delta);
        if (s[i] == '(' && k == 1 && dp1[i][0] >= 0) {
          if (UpdateMax(dp1[i + 1][1], dp1[i][0] + delta)) {
            dp2[i + 1][1] = 1;
          }
        } else if (s[i] == ')' && k == 2 && dp1[i][1] >= 0) {
          if (UpdateMax(dp1[i + 1][2], dp1[i][1] + delta)) {
            dp2[i + 1][2] = 1;
          }
        }
      }
    }
    if (UpdateMax(max_score, dp1[n][2])) {
      int cur_i = n;
      int cur_k = 2;
      int l = -1;
      int r = -1;
      while (true) {
        if (dp2[cur_i][cur_k]) {
          if (cur_k == 2) r = cur_i - 1;
          if (cur_k == 1) l = cur_i - 1;
          cur_k--;
          if (cur_k == 0) break;
        }
        cur_i--;
      }
      max_score_l = l;
      max_score_r = r;
    }
  }
  if (DEBUG) cout << "DEBUG 1" << endl;
  for (int new_min = x_min; new_min <= x_min + 2; new_min++) {
    auto dp1 = Make2DVector(n + 1, 3, -1);
    auto dp2 = Make2DVector(n + 1, 3, 0);
    dp1[0][0] = 0;
    for (int i = 0; i < n; i++) {
      for (int k = 0; k < 3; k++) {
        int new_x = xs[i + 1] + ((k == 1) ? 2 : 0);
        int delta = (new_x == new_min) ? 1 : 0;
        if (new_x < new_min) continue;
        if (dp1[i][k] >= 0) UpdateMax(dp1[i + 1][k], dp1[i][k] + delta);
        if (s[i] == ')' && k == 1 && dp1[i][0] >= 0) {
          if (UpdateMax(dp1[i + 1][1], dp1[i][0] + delta)) {
            dp2[i + 1][1] = 1;
          }
        } else if (s[i] == '(' && k == 2 && dp1[i][1] >= 0) {
          if (UpdateMax(dp1[i + 1][2], dp1[i][1] + delta)) {
            dp2[i + 1][2] = 1;
          }
        }
      }
    }
    if (UpdateMax(max_score, dp1[n][2])) {
      int cur_i = n;
      int cur_k = 2;
      int l = -1;
      int r = -1;
      while (true) {
        if (dp2[cur_i][cur_k]) {
          if (cur_k == 2) r = cur_i - 1;
          if (cur_k == 1) l = cur_i - 1;
          cur_k--;
          if (cur_k == 0) break;
        }
        cur_i--;
      }
      max_score_l = l;
      max_score_r = r;
    }
  }
  cout << max_score << endl;
  cout << max_score_l + 1 << " " << max_score_r + 1 << endl;
}
