intsolve(){
cin >> n >> m;for(int i =1; i <= n; i ++) cin >> a[i];
a[n +1]=2* m - a[n];int res =0;for(int i =1; i <= n +1; i ++) res =max(res, a[i]- a[i -1]);return res;}
ll solve(){
cin >> n;for(int i =1; i <= n; i ++) cin >> a[i];
ll res =0;int t =1;for(int i =1; i <= n; i ++){if(a[i]> t) res += a[i]- t, t = a[i];else t =min(t, a[i]);}return res;}
voidsolve(){
cin >> n;for(int i =1; i <= n; i ++) cin >> a[i];
set<int> st[2];for(int i =1; i <= n; i ++) st[0].insert(a[i]);int res =0;bool vis =false;
vector<int> e;while(st[0].size()>1){int Min =*st[0].begin();int x =0;if(Min &1) x =1;elseif(Min >>1&1^1) x =2;
st[1].clear();for(auto i : st[0]) st[1].insert(i + x >>1);
e.push_back(x);
res ++;
st[0].clear();swap(st[0], st[1]);}
cout << res << endl;if(res <= n){for(auto i : e) cout << i <<' ';
cout << endl;}}
intsolve(){int res =2e9;
cin >> n;
multiset<int> st[2];for(int i =0; i < n; i ++) cin >> a[i], st[0].insert(i + a[i]);for(int i =0; i < n; i ++){
st[0].erase(st[0].find(i + a[i]));int t = a[i];if(st[0].size()) t =max(t,*st[0].rbegin());if(st[1].size()) t =max(t,*st[1].rbegin());
res =min(res, t);
st[1].insert(n -1- i + a[i]);}return res;}