#include <bits/stdc++.h>
using namespace std;
struct BitSet {
  unsigned long long b[81];
  inline void set(int p) { b[p / 64] |= (1ULL << (p % 64)); }
  inline bool hasIntr(const BitSet& o) const {
    for (int i = 0; i < 80; i++) {
      if (b[i] & o.b[i]) {
        return true;
      }
    }
    return false;
  }
};
const int maxn = 5010;
BitSet lSet[maxn], rSet[maxn];
bool d[maxn][maxn];
char s[maxn];
int n, ans;
inline bool isMatch(char a, char b) {
  if (a == '(') {
    return b == ')' || b == '?';
  }
  if (a == '?') {
    return b == ')' || b == '?';
  }
  return false;
}
int main() {
  scanf("%s", s + 1);
  n = strlen(s + 1);
  for (int i = 1; i < n; i++) {
    if (isMatch(s[i], s[i + 1])) {
      d[i][i + 1] = true;
      rSet[i].set(i + 2);
      lSet[i + 1].set(i);
      ans++;
    }
  }
  for (int len = 4; len <= n; len += 2) {
    for (int i = 1; i < n; i++) {
      int j = i + len - 1;
      if (j > n) {
        break;
      }
      if (d[i + 1][j - 1] && isMatch(s[i], s[j])) {
        d[i][j] = true;
        rSet[i].set(j + 1);
        lSet[j].set(i);
        ans++;
        continue;
      }
      if (rSet[i].hasIntr(lSet[j])) {
        d[i][j] = true;
        rSet[i].set(j + 1);
        lSet[j].set(i);
        ans++;
      }
    }
  }
  printf("%d\n", ans);
  return 0;
}
