← Home
#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
#include <cmath>
#include <algorithm>
#include <random>
 
#define int long long
#define REP(i,l,r) for(int i=l;i<=r;i++)
#define DEP(i,r,l) for(int i=r;i>=l;i--)
#define MAX(a, b) (a) = std::max((a), (b))
#define MIN(a, b) (a) = std::min((a), (b))
#define pii std::pair<int, int>
#define fi first
#define se second
#define pb push_back
#define uint unsigned long long
#define int long long
#define X(_) (_)
#define Y(_) (dp[_] + _ * _)
#define B(_) (dp[_] - _ * _)
#define K(_) (2 * _)
 
void read(){}
template<typename T1,typename ...T2>inline void read(T1 &x,T2 &...oth)
{
  x=0;
  int f=0,ch=getchar();
  while(ch<'0'||ch>'9')
  {
    if(ch=='-')
    {
      f=1;
    }
    ch=getchar();
  }
  while('0'<=ch&&ch<='9')
  {
    x=(x<<3)+(x<<1)+(ch^48);
    ch=getchar();
  }
  if(f)
  {
    x=-x;
  }
  read(oth...);
}
 
namespace YZLK{
  const int N = 3e5 + 10;
  int n;
  char c[N], t[N];
  int s[N];
  void main() {
		read(n);
    scanf("%s", c + 1);
    int mn = n, d = 1;
    REP(i, 1, n) {
      s[i] = s[i - 1];
      if (c[i] == '(')  s[i]++;
      else              s[i]--;
      if (s[i] < mn)  mn = s[i], d = i;
    }
    if (s[n]) return puts("0\n1 1\n"), void();
    REP(i, d + 1, n)  t[i - d] = c[i];
    REP(i, 1, d)      t[(n - d) + i] = c[i];
    int ans = 0, sl = 1, sr = 1, sum = 0, mx = 0, l = 0;
    int cnt = 0;
    REP(i, 1, n) {
      s[i] = s[i - 1];
      if (t[i] == '(')  s[i]++;
      else              s[i]--;
      ans += (s[i] == 0);
    }
    bool flag = 0;
    REP(i, 1, n) {
      if (t[i] == ')') {
        if (sum > mx) sl = l, sr = i, mx = sum;
      }
      if (s[i] <= 1)  l = i, sum = 0, flag = 0;
      else {
        if (t[i] == '(' and !flag) {
          l = i;
          flag = 1;
        }
        if (s[i] == 2 and flag)  sum++;  
      }
    }
    ans += mx;
    flag = 0, sum = 0, mx = 0, l = 0;
    int pl = 1, pr = 1;
    REP(i, 1, n) {
      if (t[i] == ')') {
        if (sum > mx) pl = l, pr = i, mx = sum;
      }
      if (s[i] < 1)  l = i, sum = 0, flag = 0;
      else {
        if (t[i] == '(' and !flag) {
          l = i;
          flag = 1;
        }
        if (s[i] == 1 and flag)  sum++;  
      }
    }
    cnt += mx;
    if (cnt >= ans) std::cout << cnt << '\n' << (pl + d - 1) % n + 1 << ' ' << (pr + d - 1) % n + 1 << '\n';
    else  std::cout << ans << '\n' << (sl + d - 1) % n + 1 << ' ' << (sr + d - 1) % n + 1 << '\n';
    /*
    (()(()))()
    (())()()()
    ()(()(()))
    1012123210
    ))(()(())(
    
    */
    return;
  }
}
 
signed main()
{
  // freopen(".in","r",stdin);
  // freopen(".out","w",stdout);
  int T=1;
  // read(T);
  while(T--)
  {
    YZLK::main();
  }
 
  fclose(stdin);
  fclose(stdout);
  return 0;
}
 
/*
 
code by yqfff_qwq
 
交代码之前看一下
 
这是你的代码吗?这是你要交的题吗?
 
多测了吗?多测清空了吗?多测清空会超时吗?会出现其他问题吗?
 
数组开小了吗?模数正确吗?调试删干净了吗?
 
*/