#include <bits/stdc++.h>
using namespace std;
const long long INF = 0x3f3f3f3f3f3f3f3fll;
const int maxn = 6e5 + 5;
const long long mod = 1e9 + 7;
struct Tree {
  int mi, lz, pos, cnt;
} T[maxn << 2];
inline void build(int u, int l, int r) {
  T[u].lz = T[u].mi = 0;
  T[u].pos = r;
  T[u].cnt = r - l + 1;
  if (l == r) return;
  build((u << 1), l, ((l + r) >> 1)),
      build((u << 1 | 1), ((l + r) >> 1) + 1, r);
}
inline void pushup(int u) {
  if (T[(u << 1)].mi == T[(u << 1 | 1)].mi) {
    T[u].mi = T[(u << 1)].mi;
    T[u].cnt = T[(u << 1)].cnt + T[(u << 1 | 1)].cnt;
    T[u].pos = T[(u << 1 | 1)].pos;
  } else {
    int lz = T[u].lz;
    T[u] =
        (T[(u << 1)].mi > T[(u << 1 | 1)].mi) ? T[(u << 1 | 1)] : T[(u << 1)];
    T[u].lz = lz;
  }
}
inline void pushdown(int u) {
  if (T[u].lz) {
    T[(u << 1)].lz += T[u].lz, T[(u << 1)].mi += T[u].lz;
    T[(u << 1 | 1)].lz += T[u].lz, T[(u << 1 | 1)].mi += T[u].lz;
    T[u].lz = 0;
  }
}
inline void change(int u, int l, int r, int L, int R, int v) {
  if (L <= l && r <= R) {
    T[u].lz += v;
    T[u].mi += v;
    return;
  }
  pushdown(u);
  if (L <= ((l + r) >> 1)) change((u << 1), l, ((l + r) >> 1), L, R, v);
  if (R > ((l + r) >> 1)) change((u << 1 | 1), ((l + r) >> 1) + 1, r, L, R, v);
  pushup(u);
}
Tree nod;
inline void query(int u, int l, int r, int L, int R) {
  if (L <= l && r <= R) {
    if (T[u].mi < nod.mi) {
      nod = T[u];
    } else if (T[u].mi == nod.mi) {
      nod.pos = max(nod.pos, T[u].pos);
      nod.cnt += T[u].cnt;
    }
    return;
  }
  pushdown(u);
  if (L <= ((l + r) >> 1)) query((u << 1), l, ((l + r) >> 1), L, R);
  if (R > ((l + r) >> 1)) query((u << 1 | 1), ((l + r) >> 1) + 1, r, L, R);
  pushup(u);
}
int n, m, N;
char s[maxn];
int S[maxn];
inline Tree query(int L, int R) {
  nod.mi = INF;
  query(1, 1, N, L, R);
  return nod;
}
void dbg() {
  for (int i = 1; i <= N; i++) printf("%d ", query(i, i).mi);
  puts("");
}
int main() {
  scanf("%d%d", &n, &m);
  scanf("%s", s + 1);
  N = 2 * n;
  build(1, 1, N);
  for (int i = 1; i <= n; i++) {
    S[i] = S[i + n] = (s[i] == '(' ? 1 : -1);
    change(1, 1, N, i, N, S[i]);
    change(1, 1, N, i + n, N, S[i + n]);
  }
  if (query(n, n).mi != 0) {
    puts("0\n1 1");
    return 0;
  }
  int ans = 0;
  int rl = 1, rr = 1;
  for (int i = 1; i <= n; i++) {
    Tree tmp = query(i, i + n - 1);
    if (S[i] == 1) {
      if (tmp.mi == 0) {
        if (tmp.cnt > ans) {
          ans = tmp.cnt;
          rl = rr = 1;
        }
      }
    } else {
      if (tmp.mi == -1) {
        if (tmp.pos + 1 < i + n - 1) {
          Tree tmp2 = query(tmp.pos + 1, i + n - 1);
          assert(tmp2.mi == 0);
          if (tmp2.cnt > ans) {
            ans = tmp2.cnt;
            rl = i, rr = tmp.pos + 1;
          }
        }
      } else if (tmp.mi == -2) {
        change(1, 1, N, i, tmp.pos, 2);
        Tree tmp2 = query(i, i + n - 1);
        if (tmp2.mi == -1) change(1, 1, N, tmp.pos + 1, tmp2.pos, 2);
        Tree tmp3 = query(i, i + n - 1);
        assert(tmp3.mi == 0);
        if (tmp3.cnt > ans) {
          ans = tmp3.cnt;
          rl = i, rr = tmp2.pos + 1;
        }
        change(1, 1, N, i, tmp2.pos, -2);
      }
    }
    change(1, 1, N, i, N, -S[i]);
  }
  if (rl > n) rl -= n;
  if (rr > n) rr -= n;
  printf("%d\n%d %d\n", ans, rl, rr);
  return 0;
}
