#include <bits/stdc++.h>
namespace IO {
char gc() { return getchar(); }
template <typename Tp>
bool get1(Tp &x) {
  bool neg = 0;
  char c = gc();
  while (c != EOF && (c < '0' || c > '9') && c != '-') c = gc();
  if (c == '-') c = gc(), neg = 1;
  if (c == EOF) return false;
  x = 0;
  for (; c >= '0' && c <= '9'; c = gc()) x = x * 10 + c - '0';
  if (neg) x = -x;
  return true;
}
template <typename Tp>
void printendl(Tp x) {
  if (x < 0) putchar('-'), x = -x;
  static short a[40], sz;
  sz = 0;
  while (x > 0) a[sz++] = x % 10, x /= 10;
  if (sz == 0) putchar('0');
  for (int i = sz - 1; i >= 0; i--) putchar('0' + a[i]);
  puts("");
}
}  // namespace IO
using IO::get1;
using IO::printendl;
const int inf = 0x3f3f3f3f;
const long long Linf = 1ll << 61;
const int maxn = 1000111;
char s[maxn];
int n, suf[maxn];
int check(int x) {
  if (x < 0) return inf;
  int sum = 0, mn = 0;
  for (int i = 1; i <= n; i++) {
    if (s[i] == '0')
      sum++;
    else if (s[i] == '1')
      sum--;
    else if (sum + suf[i + 1] >= x)
      sum--;
    else
      sum++;
    if (sum > x) return inf;
    mn = std::min(mn, sum);
  }
  return x - mn;
}
int main() {
  scanf("%s", s + 1);
  n = strlen(s + 1);
  int sum = 0, mx = 0;
  for (int i = 1; i <= n; i++) {
    if (s[i] == '0')
      sum++;
    else
      sum--;
    mx = std::max(mx, sum);
  }
  for (int i = n; i >= 1; i--)
    suf[i] = std::max(0, suf[i + 1] + (s[i] == '0') - (s[i] != '0'));
  printf("%d\n", std::min(check(mx), check(mx - 1)));
  return 0;
}
