#include <bits/stdc++.h>
using namespace std;

using Int = long long;
const char newl = '\n';

template<typename T1,typename T2> inline void chmin(T1 &a,T2 b){if(a>b) a=b;}
template<typename T1,typename T2> inline void chmax(T1 &a,T2 b){if(a<b) a=b;}
template<typename T> void drop(const T &x){cout<<x<<endl;exit(0);}
template<typename T=int>
vector<T> read(size_t n){
  vector<T> ts(n);
  for(size_t i=0;i<n;i++) cin>>ts[i];
  return ts;
}

//INSERT ABOVE HERE
signed main(){
  cin.tie(0);
  ios::sync_with_stdio(0);

  string s;
  cin>>s;
  int n=s.size();
  vector<int> sm(n+1,0);
  for(int i=0;i<n;i++)
    sm[i+1]=sm[i]+(s[i]=='1'?1:-1);

  vector<int> mx(n+1);
  for(int i=n;i>=0;i--){
    mx[i]=sm[i];
    if(i+1<=n) chmax(mx[i],mx[i+1]);
  }

  int ans=n;
  for(int k=0;k<2;k++){
    int lim=mx[0]+k;
    int cur=0;
    int num=0;
    int low=0,hgh=0;
    for(int i=0;i<n;i++){
      if(s[i]=='1'){
        cur+=1;
        chmin(low,cur);
        chmax(hgh,cur);
        continue;
      }
      if(s[i]=='0'){
        cur-=1;
        chmin(low,cur);
        chmax(hgh,cur);
        continue;
      }
      assert(s[i]=='?');
      if(mx[i+1]+(num+1)*2<=lim){
        num++;
        cur+=1;
      }else{
        cur-=1;
      }
      chmin(low,cur);
      chmax(hgh,cur);
    }

    chmin(ans,hgh-low);
  }
  cout<<ans<<newl;
  return 0;
}
