#include <bits/stdc++.h>
using namespace std;
string str;
void push(stack<pair<bool, int>>& stk, int offset) {
  if (offset == 0) return;
  pair<bool, int> cur;
  if (stk.size() && stk.top().first)
    cur = stk.top(), stk.pop(), stk.push({1, cur.second + offset});
  else
    stk.push({1, offset});
}
bool fix_stk(stack<pair<bool, int>>& stk) {
  int offset = 0;
  while (stk.size() && (stk.top().first || stk.top().second + offset < 0))
    offset += stk.top().second * stk.top().first, stk.pop();
  if (stk.size() == 0) return false;
  pair<bool, int> cur = {0, stk.top().second + offset};
  stk.pop();
  push(stk, offset);
  stk.push(cur);
  return true;
}
bool operation(stack<pair<bool, int>>& stk, int idx) {
  pair<bool, int> cur = {0, -1};
  if (str[idx] == '?') {
    if (fix_stk(stk) == false) return false;
    cur = stk.top();
    stk.pop();
    push(stk, 1);
    stk.push({0, cur.second + 1});
    if (cur.second - 1 >= 0) stk.push({0, cur.second - 1});
  } else
    push(stk, (str[idx] == '(') - (str[idx] == ')'));
  return true;
}
int solve(int idx) {
  int ret = 0;
  stack<pair<bool, int>> stk;
  stk.push({0, 0});
  while ((idx < str.size()) && stk.size()) {
    if (operation(stk, idx) == false) return ret;
    if (fix_stk(stk) == false) return ret;
    ret += stk.top().second == 0;
    idx++;
  }
  return ret;
}
int mine() {
  int ret = 0;
  for (int i = 0; i < str.size(); i++) ret += solve(i);
  return ret;
}
int main() {
  cin >> str;
  cout << mine() << endl;
  return 0;
}
