package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
var n int
fmt.Fscan(reader, &n)
var s string
fmt.Fscan(reader, &s)
if n%2 != 0 {
fmt.Println(0)
fmt.Println("1 1")
return
}
open := 0
close := 0
for i := 0; i < n; i++ {
if s[i] == '(' {
open++
} else {
close++
}
}
if open != close {
fmt.Println(0)
fmt.Println("1 1")
return
}
cur := 0
minPref := 0
minIdx := 0
for i := 0; i < n; i++ {
if s[i] == '(' {
cur++
} else {
cur--
}
if cur < minPref {
minPref = cur
minIdx = i
}
}
shift := (minIdx + 1) % n
t := make([]byte, n)
for i := 0; i < n; i++ {
t[i] = s[(shift+i)%n]
}
S := make([]int, n+1)
S[0] = 0
for i := 0; i < n; i++ {
if t[i] == '(' {
S[i+1] = S[i] + 1
} else {
S[i+1] = S[i] - 1
}
}
c0 := 0
for i := 1; i <= n; i++ {
if S[i] == 0 {
c0++
}
}
maxBeauty := c0
bestL := 1
bestR := 1
prevZero := 0
for i := 1; i <= n; i++ {
if S[i] == 0 {
L := prevZero + 1
R := i
cnt1 := 0
for j := L; j <= R; j++ {
if S[j] == 1 {
cnt1++
}
}
if cnt1 > maxBeauty {
maxBeauty = cnt1
bestL = L
bestR = R
}
prevZero = i
}
}
prevLeq1 := 0
for i := 1; i <= n; i++ {
if S[i] <= 1 {
if prevLeq1 > 0 && S[prevLeq1] == 1 && S[i] == 1 && i > prevLeq1+1 {
L := prevLeq1 + 1
R := i
cnt2 := 0
for j := L; j <= R; j++ {
if S[j] == 2 {
cnt2++
}
}
if c0+cnt2 > maxBeauty {
maxBeauty = c0 + cnt2
bestL = L
bestR = R
}
}
prevLeq1 = i
}
}
origL := (shift + bestL - 1) % n + 1
origR := (shift + bestR - 1) % n + 1
fmt.Println(maxBeauty)
fmt.Printf("%d %d\n", origL, origR)
}