#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
// Check if the input is valid: only '(' and ')', and no extra characters
bool checkInput(const std::string& s) {
if (s.empty() || s.size() > 100000)
return false;
std::istringstream ss(s);
std::string token, remain;
if (!(ss >> token) || (ss >> remain)) return false;
for (char c : s) {
if (c != '(' && c != ')') return false;
}
return true;
}
// Count the number of ways to change exactly one parenthesis to make the string valid
int countValidCorrections(const std::string& s) {
int n = s.size();
std::vector<int> total(n); // total[i]: cumulative sum from s[0] to s[i], with '(' = +1, ')' = -1
std::vector<int> minLeft(n); // minLeft[i]: minimum value of total[0..i]
std::vector<int> minRight(n); // minRight[i]: minimum value of total[i..n-1]
total[0] = (s[0] == '(' ? 1 : -1);
minLeft[0] = total[0];
for (int i = 1; i < n; ++i) {
int value = (s[i] == '(' ? 1 : -1);
total[i] = total[i - 1] + value;
minLeft[i] = std::min(minLeft[i - 1], total[i]);
}
minRight[n - 1] = total[n - 1];
for (int i = n - 2; i >= 0; --i) {
minRight[i] = std::min(total[i], minRight[i + 1]);
}
if (std::abs(total[n - 1]) != 2)
return 0;
bool isTotalPlus2 = (total[n - 1] == 2);
char changeChar = isTotalPlus2 ? '(' : ')';
int flip = isTotalPlus2 ? -2 : 2;
int result = 0;
for (int i = 0; i < n; ++i) {
if (s[i] == changeChar) {
bool isValidLeft = (i == 0 || minLeft[i - 1] >= 0);
bool isValidRight = (minRight[i] + flip >= 0);
if (isValidLeft && isValidRight)
++result;
}
}
return result;
}
int main() {
std::string s;
std::cin >> s;
if (!checkInput(s)) {
std::cout << "Invalid input: The string must contain only '(' and ')' and its length must be between 1 and 100000.\n";
return 1;
}
std::cout << countValidCorrections(s) << std::endl;
return 0;
}