This is yet another problem dealing with regular bracket sequences.

We should remind you that a bracket sequence is called regular, if by inserting «+» and «1» into it we can get a correct mathematical expression. For example, sequences «(())()», «()» and «(()(()))» are regular, while «)(», «(()» and «(()))(» are not. 

You are given a string of «(» and «)» characters. You are to find its longest substring that is a regular bracket sequence. You are to find the number of such substrings as well.
The first line of the input file contains a non-empty string, consisting of «(» and «)» characters. Its length does not exceed 10<sup class="upper-index">6</sup>.
import math
import heapq
import bisect
import functools
import itertools
import collections
import os
import sys
from io import BytesIO, IOBase
from typing import List

MOD0 = 10 ** 9 + 7
MOD1 = 998244353
BUFSIZE = 8192


class FastIO(IOBase):
    newlines = 0

    def __init__(self, file):
        self._fd = file.fileno()
        self.buffer = BytesIO()
        self.writable = "x" in file.mode or "r" not in file.mode
        self.write = self.buffer.write if self.writable else None

    def read(self):
        while True:
            b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
            if not b:
                break
            ptr = self.buffer.tell()
            self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr)
        self.newlines = 0
        return self.buffer.read()

    def readline(self):
        while self.newlines == 0:
            b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
            self.newlines = b.count(b"\n") + (not b)
            ptr = self.buffer.tell()
            self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr)
        self.newlines -= 1
        return self.buffer.readline()

    def flush(self):
        if self.writable:
            os.write(self._fd, self.buffer.getvalue())
            self.buffer.truncate(0), self.buffer.seek(0)


class IOWrapper(IOBase):
    def __init__(self, file):
        self.buffer = FastIO(file)
        self.flush = self.buffer.flush
        self.writable = self.buffer.writable
        self.write = lambda s: self.buffer.write(s.encode("ascii"))
        self.read = lambda: self.buffer.read().decode("ascii")
        self.readline = lambda: self.buffer.readline().decode("ascii")


sys.stdin, sys.stdout = IOWrapper(sys.stdin), IOWrapper(sys.stdout)
input = lambda: sys.stdin.readline().rstrip("\r\n")
read_str = lambda: input().strip()
read_int = lambda: int(input())
read_ints = lambda: map(int, input().split())
read_list_ints = lambda: list(map(int, input().split()))
read_list_strs = lambda: input().strip().split()


def solve():
    s, ans1, ans2, rec = read_str(), 0, 0, collections.defaultdict(list)

    n = len(s)
    pre = [0] * (n + 1)
    for i, c in enumerate(s):
        if c == '(':
            pre[i + 1] = pre[i] + 1
            rec[pre[i]].append(i)
        else:
            pre[i + 1] = pre[i] - 1

    left, st = [-1] * (n + 1), []
    for i in range(n, -1, -1):
        while st and st[-1][0] > pre[i]:
            left[st.pop()[1]] = i
        st.append((pre[i], i))

    for i in range(1, n):
        if s[i] == ')':
            i += 1
            idx = bisect.bisect_right(rec[pre[i]], left[i])
            if idx < len(rec[pre[i]]):
                tmp = i - rec[pre[i]][idx]
                if tmp > ans1:
                    ans1 = tmp
                    ans2 = 1
                elif tmp == ans1:
                    ans2 += 1

    if ans1:
        print(ans1, ans2)
    else:
        print(0, 1)


solve()