#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
#define mp make_pair
#define PI pair<ll,ll>
#define poly vector<ll>
#define mem(a) memset((a),0,sizeof(a))
#define For(i,l,r) for(int i=(int)(l);i<=(int)(r);i++)
#define Rep(i,r,l) for(int i=(int)(r);i>=(int)(l);i--)
#define pb push_back
#define fi first
#define se second
#define SZ(x) ((int)(x.size()))
inline char gc(){
    static char buf[100000],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
#define gc getchar
inline ll read(){
	ll x = 0; char ch = gc(); bool positive = 1;
	for (; !isdigit(ch); ch = gc())	if (ch == '-')	positive = 0;
	for (; isdigit(ch); ch = gc())	x = x * 10 + ch - '0';
	return positive ? x : -x;
}
inline void write(ll a){
    if(a<0){
    	a=-a; putchar('-');
	}
    if(a>=10)write(a/10);
    putchar('0'+a%10);
}
inline void writeln(ll a){write(a); puts("");}
inline void wri(ll a){write(a); putchar(' ');}
ll rnd(){
	ull ans=0;
	For(i,0,4)ans=ans<<15^rand();
	return ans%((ull)1<<63);
}
const int N=1000005;
char ch[N];
int ans;
int main(){
	#ifdef Brollan
		//freopen("1.in","r",stdin);
	#endif
	scanf("%s",ch+1);
	int n=strlen(ch+1);
	int x=0,y=0;
	Rep(i,n,1){
		if(ch[i]=='0'){x++; y--;}
		else if(ch[i]=='1'){x--; y++;}
		else {x--; y--;}
		x=max(x,0);
		y=max(y,0);
		ans=max(ans,max(x,y));
	}
	int l=0,r=ans,sum=ans,zt=1;
		For(i,1,n){
			if(l==r)zt=0;
			if(ch[i]=='0'){
				l++; r++; 
				if(r>sum){if(zt)r=sum; else {r=sum-1;}}
			}else if(ch[i]=='1'){
				l--; r--; 
				if(l<0){if(zt)l=0; else {l=1;}}
			}else{
				l--; r++;
				if(r>sum){if(zt)r=sum; else {r=sum-1; }}
				if(l<0){if(zt)l=0; else {l=1; }}
			}
			if(l>sum||r<0){
				sum++; break;
			}
			//cout<<l<<" "<<r<<" mx:"<<mx<<" sum:"<<sum<<" "<<zt<<endl;
		}
	cout<<sum<<endl;
}
/*
20
01

40
50/31
41/22
23/04
14/05
*/