def split_outer(s): parts = [] depth = 0 start = 0 for i, c in enumerate(s): if c == '(': if depth == 0: start = i depth += 1 else: depth -= 1 if depth == 0: parts.append(s[start+1:i]) return parts def compute_grundy(s): memo = {} stack = [(s, False)] while stack: current, processed = stack.pop() if current in memo: continue if not processed: parts = split_outer(current) all_processed = True for part in parts: if part not in memo: all_processed = False break if all_processed: res = 0 for part in parts: res ^= (memo[part] + 1) memo[current] = res else: stack.append((current, True)) for part in reversed(parts): if part not in memo: stack.append((part, False)) else: parts = split_outer(current) res = 0 for part in parts: res ^= (memo[part] + 1) memo[current] = res return memo.get(s, 0) H = input().strip() grundy_val = compute_grundy(H) print(0 if grundy_val != 0 else 1)