#include<bits/stdc++.h>

using namespace std;
#define ll long long

const int N = 1000005;
int n, a[N], f[N<<2], g[N<<2], h[N<<2];
char s[N];
set<int> c, d;
void build(int l, int r, int t){
	if(l==r) return (void)(f[t]=g[t]=a[l]);
	int mid=(l+r)>>1, k=t<<1;
	build(l, mid, k), build(mid+1, r, k|1);
	f[t]=max(f[k], f[k|1]), g[t]=min(g[k], g[k|1]), h[t]=0;
}
int find(int l, int r, int t, int x){
	if(l==r) return l;
	int mid=(l+r)>>1, k=t<<1;
	if(h[t]) f[k]+=h[t], g[k]+=h[t], f[k|1]+=h[t], g[k|1]+=h[t], h[t]=0;
	if(f[k]>x) return find(l, mid, k, x);
	else return find(mid+1, r, k|1, x);
}
void change(int l, int r, int t, int L){
	if(L<=l) return (void)(f[t]-=2, g[t]-=2, h[t]-=2);
	int mid=(l+r)>>1, k=t<<1;
	if(h[t]) f[k]+=h[t], g[k]+=h[t], f[k|1]+=h[t], g[k|1]+=h[t], h[t]=0;
	if(L<=mid) change(l, mid, k, L);
	change(mid+1, r, k|1, L);
	f[t]=max(f[k], f[k|1]), g[t]=min(g[k], g[k|1]);
}
int main() {
	scanf("%s", s+1), n=strlen(s+1);
	for(int i=1; i<=n; ++i){
		a[i]=a[i-1]+(s[i]=='0'?-1:1);
		if(s[i]=='?') c.insert(i);
	}
	d=c;
	int ans=n;
	build(0, n, 1);
	for(int i=n;; i-=2){
		if(f[1]>i){
			int x=find(0, n, 1, i);
			auto it=c.upper_bound(x);
			if(it==c.begin()) break;
			change(0, n, 1, *--it);
			c.erase(it);
		}
		ans=min(ans, f[1]-g[1]);
	}
	build(0, n, 1);
	for(int i=n+1;; i-=2){
		if(f[1]>i){
			int x=find(0, n, 1, i);
			auto it=d.upper_bound(x);
			if(it==d.begin()) break;
			change(0, n, 1, *--it);
			d.erase(it);
		}
		ans=min(ans, f[1]-g[1]);
	}
	printf("%d\n", ans);
	return 0;
}