C: Short-circuit evaluation

problem

Naodai-kun and Hokkaido University-kun are playing games. Hokkaido University first generates the following logical formula represented by BNF.


<formula> :: = <or-expr>
<or-expr> :: = <and-expr>
| <or-expr> "|" <and-expr>
<and-expr> :: = <term>
| <and-expr> "&" <term>
<term> :: = "(" <or-expr> ")" | "?"


`&` represents the logical product, `|` represents the logical sum, and `&` is evaluated before `|`.

Naodai reads this formula from the left (as a string), and when he finds a `?`, He does the following:

* If it is certain that the evaluation result of the formula does not change regardless of whether the `?` Is `0` or` 1`, read it without doing anything.
* If not, pay 1 yen to Hokkaido University and replace the `?` With `0` or` 1`.



The logical expression is evaluated as follows. It is a so-called ordinary formula.


(0 &?) == 0
(1 & 0) == 0
(1 & 1) == 1
(0 | 0) == 0
(0 | 1) == 1
(1 |?) == 1


What is the minimum amount Naodai has to pay to finalize the evaluation result of a well-formed formula? Obtain the evaluation result depending on whether it is set to `0` or` 1`.

Input format

A formula that follows the BNF above is given in one line.

Constraint

The length of the formula does not exceed 2 \ times 10 ^ 5.

Output format

Output the minimum amount required to make the evaluation result `0`,` 1`, separated by blanks.

Input example 1


? &? |? &? |? &?

Output example 1


3 2

If you want to make it `0`, rewrite it with` 0 0 0` to make it `0 &? | 0 &? | 0 &?`, If you want to make it `1`, rewrite it with` 1 1` and make it `1 & 1 |? &? |? & It is best to use? `.

Input example 2


? &? &? |? &? &?

Output example 2


twenty three

They are `0 &? &? | 0 &? &?` And `1 & 1 & 1 |? &? &?`, Respectively.

Input example 3


(? |? |?) &? &? &? &? |? &? |? &?

Output example 3


4 4





Example

Input

?&?|?&?|?&?


Output

3 2
/* Aa^~ kokoro ga pyonpyon suru n jaa^~
// ZZZXXkXkkkZ!``` ``` ``` ``` ``` ``` ``` ``` ``` ``` ``` ```?Wfpppbpbbpbbpbbbkbkk
// ppbbbpbbpVr`` `` ` ` ` ` ```` `` ` ` ``  ` ` ` ` ` ` ` ` `  dppbbkkkkkkkkkkqkqkk
// HkqqqqqkkWr`` ` ` ``` ``` `?G, ` ` ``.JC!```` ` ` `` `` ````(Wpbkkkkkkkkqkkkkkqk
// mmmmmqqqqpr` `` `` ```````.+zT=`` `` 7TO-.```````` `` `` ```(yppbkkkkkkkkkkkkkkk
// ggmgmmqqqH$ ``````````....````` `  ````````.`````` `` ``````.yfpppbbbbkkkkqqqqqH
// gmmmmmqqqkW<```` `````...`````  .,.`  ````....````` ``````` (Wbqqmgmmgmggggggggg
// qmmmqqqqkkWk.``````````````````` ;:<`` `````.`````````````-_<-?WHHqmmmmmmgmmgggg
// @@@@@@@gggHH6- ``````````````` `` _ `` ```````````````` ._~~_.`-?Wkqmmmmmmmggg@g
// @@@@g@gggHY~.-<_- `````````````````````````````````` ._~~(<-``.`.(WHqqqmmggggmmm
// @@g@gggHH=.`..._<-___..```````````````````````. .-_~~~_(!``-.``.`` OHHWUWHmqHWXW
// gggggmqK1.``..~.. _<<+-(____..  ````````  ..__~~_((<<!.`.``` .``.`` j0C1XUHmHIdW
// ggmmqH0!,_``.>`````` _<<;<v<<<++((((((((((<<<<<<~_. (-.``~``.>..```  jOuWHHqHIdH
// gmmqkW!`(_ J>`    `` ` _~<`_~~~~<<<<<<<~~__````````` ?1. ._`(__```    zXWHg@HkXH
// gHHWS{``(lJ<!``.``.```(:+>`._`````.` <..`` - ``. `   _ ?&._.I`_`````` .XyVfppppW
// HHHSv``.(X:_..... _..(;+<!.(<..-.....-.-_..+_`..<.`.`..`_IJd}  .`..````jqg@@@@@@
// XHWZ{..<Jk~!.`.. (<.-(+>(_.(1.(_..`.`.`.<_.+<_..<<-..._..-zy>.`_`...```.WH@HHHHH
// bkWt~.-jCz(_..`.(+<.(;< ._-<=_(<_..-....(_.<1<..(<<.`._..-JUS-._.`...```dHmH9VUH
// WUUO..(f.(c...__+z<-(+~` _-+<_(><..__.`.(<._.z_.(1;_..__.(C(zT-(..`...``(WHR<+Xk
// kkkk._(_.->..._(z;:_><.._>_+_<(1>_._<...(v<<.(<.(+z<..-_(Z~_<_j+_..`...`(WHKz1ZW
// @@gR._+_..~..-<+z<<?<>```_.<_.(+1><_;_..(1_:`.<<??1z--(+Z!..<_.j<....`..(bgHAAQX
// @@mR.(j:..~.._<z!`.(>~``` ~(_.(+<1><><_.(((_`.<__`.<_.(X>...<_.(<.....`.JUWWWyWW
// @gmH_(zl..(.._+>```<+_````.~>``(+.<?>>_._(<```(<<``(__<>....<.._<.......dXkkkHHH
// mmqHl(dk_.(_.-=~`.`.1-..._~-1.``_:`(??<_~(`.--.&_.`.<(;<...._.._<..`..._Xg@@@@@@
// qHkpk(dX<.(;..j_```.(((JJ&a&-~``````.1<_```-(((e+.-(/`(>...._..(<......(Wmggg@@g
// HVHbWcz><__+_.(_.(dWWHHH@HHc~````````.+~`` (jHMMMHHHm&.?..._<..(<_..._.(WqqHHmHg
// 0>vWWkzZwl~<o.__`__~X@@HM@Hb ```.`.``. ```` d@@HHH@@K?76...(<..(<_...(_(ppWWWWHq
// X0XWHKXXw$<(z<.( `` WHHMHHHH_``````````````.WHHMNMHHH_`(...(<_.(z_..._<(fWVC174W
// XuXWHHWWz>__+z+.!`..??CZYCOX_`````````````.`~.OvTUZUS_`~.._+?_.(_~_.._zjO=1+~+jy
// kkkkkkkkX:._<z=1(_`` << ``->``.``.``.``.```` ?<`` (v!`._..(??_.(1._.._=dUOOzzzwX
// @@@@@@@@H<...1O=v<_...__ -_````````````````.`` `` ~.`` :.~+=?~.(;_(...jdQQQQQkkk
// H@@@@@@@H~...(==>.~~~~~....`.`````````.`````.`........->.(===~~<<.(...(dg@@@@@@@
// @@@H@@HHH_.__(=l>~.~~~~~....``.``.``.```..`......~~~~~(<_+=l=~_<.->..~_dqggggg@g
// @H@@@@MHH_._<(=l>...........```````````````.`...~~~~~~+<(=lz=~((j=z_..~jWqmmgggm
// @@H@@HHWH_._<(lll-.......```.````.``.`..`````........_z<+llZz~(lOO=<...(VYUUUW9Y
// @@HMMHWZf>~_=:=llw+.`````````.`.```__~~_``.`````.....(z+llOOz_zllOlz~..~<<1+dW>_
// MMM#MHHWXl~_=>1ltwOl&.`.``.`````.``````````````.````.(llttwtz(OltwOz<..__zwOwwOz
// HM#HMHUUI<._1z+ttOZttlt&....``.``.`.````.``...``...(zZtttOktzjttttwlz_._<(Xkkkkk
// HHHmHSZu:(_~+OztttXtttOZZttO+-..............-(+ztOttwttttd0tOZttttwOl<~.(_dMMHHH
// rvuuXuuI~~<~(uttttwvOwwwkQQHMMHHHHHHHHHMMMNmgey?OwwwrtttwXOtwttttttXtO-~.((wZyyy
// HHHHHHK>(~(-(dOrtrrl(QgMHMMMHHHHHHHHHHHHHHHH##HMNkX0rrrrXXrd%`` (Ctwwtz_~.<(Wg@H
// NNNNNHD(~(zo~zXrrrQdHHMMNMHHHHHHHHHHHHHHHHHHHHHH##HNmyrdKkwZ ` _``-zwrt1~~_<(MNM
// MMMMM#<<_jwr:(Z4QHHMMHMHHHHHHHHHHHHHHHHHHHHHHHHHHHH###NHSXZ>` ~````.OXtt>~._<?MM
*/

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

using VI = vector<int>;
using VVI = vector<VI>;
using PII = pair<int, int>;
using LL = long long;
using VL = vector<LL>;
using VVL = vector<VL>;
using PLL = pair<LL, LL>;
using VS = vector<string>;

#define ALL(a)  begin((a)),end((a))
#define RALL(a) (a).rbegin(), (a).rend()
#define PB push_back
#define EB emplace_back
#define MP make_pair
#define MT make_tuple
#define SZ(a) int((a).size())
#define SORT(c) sort(ALL((c)))
#define RSORT(c) sort(RALL((c)))
#define UNIQ(c) (c).erase(unique(ALL((c))), end((c)))

#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n)  FOR(i,0,n)

#define FF first
#define SS second

template<class S, class T>
istream& operator>>(istream& is, pair<S,T>& p){
  return is >> p.FF >> p.SS;
}
template<class T>
istream& operator>>(istream& is, vector<T>& xs){
  for(auto& x: xs)
	is >> x;
  return is;
}
template<class S, class T>
ostream& operator<<(ostream& os, const pair<S,T>& p){
  return os << p.FF << " " << p.SS;
}
template<class T>
ostream& operator<<(ostream& os, const vector<T>& xs){
  for(unsigned int i=0;i<xs.size();++i)
	os << (i?" ":"") << xs[i];
  return os;
}
template<class T>
void maxi(T& x, T y){
  if(x < y) x = y;
}
template<class T>
void mini(T& x, T y){
  if(x > y) x = y;
}
void debug(istringstream&){}
template <char sep=',', class Head, class... Tail>
void debug(istringstream& iss, Head&& head, Tail&&... tail)
{
  string name;
  getline(iss, name, ',');
  cout << sep << name << "=" << head;
  debug(iss, forward<Tail>(tail)...);
}

#ifdef PYONPOI
#define DEBUG(...) \
  do{ \
    istringstream ss(#__VA_ARGS__); \
    debug<' '>(ss, __VA_ARGS__); \
    cout<<endl; \
  }while(0)
#else
#define DEBUG
#endif


const double EPS = 1e-10;
const double PI  = acos(-1.0);
const LL MOD = 1e9+7;

const int MAX = 2e5+10;
const int INF = 1e7;

int N;
string s;
int dp[3][MAX][2];
int to[3][MAX][2];
int or_(int& i, int f);
int and_(int& i, int f);
int term_(int& i, int f);

int or_(int& i, int f){
  const int id = 0;
  const int orig_i = i;
  int& res = dp[id][i][f];
  int& idx = to[id][i][f];

  if(res < INF){
    i = idx;
    return res;
  }

  if(f == 0){
    int e = and_(i, 0);

    if(i < N && s[i] == '|'){
      ++i;
      e += or_(i, 0);
    }
    res = e;
  }
  else{ // f == 1
    int a0 = and_(i, 0);
    i = orig_i;
    int a1 = and_(i, 1);

    int b0 = 0, b1 = INF;
    if(i < N && s[i] == '|'){
      ++i;
      int ii = i;
      b0 = or_(i, 0);
      i = ii;
      b1 = or_(i, 1);
    }

    res = min(a0 + b1, a1);
  }
  idx = i;
  return res;
}

int and_(int& i, int f){
  const int id = 1;
  const int orig_i = i;
  int& res = dp[id][i][f];
  int& idx = to[id][i][f];

  if(res < INF){
    i = idx;
    return res;
  }

  if(f == 1){
    int e = term_(i, 1);

    if(i < N && s[i] == '&'){
      ++i;
      e += and_(i, 1);
    }
    res = e;
  }
  else{ // f == 0
    int a0 = term_(i, 0);
    i = orig_i;
    int a1 = term_(i, 1);

    int b0 = INF, b1 = 0;
    if(i < N && s[i] == '&'){
      ++i;
      int ii = i;
      b0 = and_(i, 0);
      i = ii;
      b1 = and_(i, 1);
    }

    res = min(a1 + b0, a0);
  }
  idx = i;
  return res;
}

int term_(int& i, int f){
  const int id = 2;
  const int orig_i = i;
  int& res = dp[id][i][f];
  int& idx = to[id][i][f];

  if(res < INF){
    i = idx;
    return res;
  }

  if(s[i] == '('){
    ++i;
    res = or_(i, f);
    assert(s[i] == ')');

    ++i;
    idx = i;
    return res;
  }
  else if(s[i] == '?'){
    ++i;
    res = 1;
    idx = i;
    return res;
  }

  assert((printf("%d\n", i) && false));
  return -1;
}


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

  cin >> s;
  N = SZ(s);
  fill((int*)dp, (int*)dp+3*MAX*2, INF);
  int i = 0, j = 0;
  cout << or_(i, 0) << " " << or_(j, 1) << endl;

  return 0;
}
