#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <cmath>
#include <map>
#include <queue>
#include <iomanip>
#include <set>
#include <tuple>
#define mkp make_pair
#define mkt make_tuple
#define rep(i,n) for(int i = 0; i < (n); ++i)
using namespace std;
typedef long long ll;
const ll MOD=1e9+7;
template<class T> void chmin(T &a,const T &b){if(a>b) a=b;}
template<class T> void chmax(T &a,const T &b){if(a<b) a=b;}

int main(){
  cin.tie(0);
  ios::sync_with_stdio(false);

  string S;
  cin>>S;
  int N=S.size();

  int dep=0;
  vector<int> d(N+1,0);
  for(int i=0;i<N;i++){
      if(S[i]=='0'||S[i]=='?') dep--;
      else dep++;
      d[i+1]=dep;
  }
  for(int i=N-1;i>=0;i--) chmax(d[i],d[i+1]);
  int Z=d[0];

  int mxs=Z;
  int ans=N;
  rep(k,2){
      int mis=0;
      int dep=0;
      int pls=0;
      for(int i=0;i<N;i++){
          if(S[i]=='0') dep--;
          else if(S[i]=='1') dep++;
          else{
              if(d[i+1]+2*pls+2<=mxs){
                  dep++;
                  pls++;
              }else{
                  dep--;
              }
          }
          chmin(mis,dep);
      }
      chmin(ans,mxs-mis);
      mxs++;
  }

  cout<<ans<<endl;

  return 0;
}
