#include <bits/stdc++.h>   #pragma GCC optimize( -O3 )   using namespace std;   void _main();   int main() {     cin.tie(0);     ios::sync_with_stdio(false);     _main();   }   const int inf = INT_MAX / 2;   const long long infl = 1LL << 60;   template <class T>   bool chmax(T &a, const T &b) {     if (a < b) {       a = b;       return 1;     }     return 0;   }   template <class T>   bool chmin(T &a, const T &b) {     if (b < a) {       a = b;       return 1;     }     return 0;   }   string E;   int P, M;   struct Node {     Node *left, *right;     int value, id, cnt;   };   int i = 0, idx = 0;   Node *parse() {     Node *n = new Node;     n->id = idx;     idx++;     if (E[i] ==  ( ) {       i++;       n->left = parse();       i++;       n->right = parse();       i++;       n->value = -1;       n->cnt = n->left->cnt + n->right->cnt + 1;     } else {       n->value = E[i] -  0 ;       i++;       n->cnt = 0;     }     return n;   }   int vis[4101][105];   pair<int, int> memo[4101][105];   pair<int, int> f(Node *n, int p) {     int m = n->cnt - p;     if (m < 0) return {inf, inf};     int id = n->id;     if (vis[id][p]) return memo[id][p];     if (n->cnt == 0) return memo[id][p] = {n->value, n->value};     int mi = inf, ma = -inf;     for (int pls = 0; pls < p; pls++) {       auto le = f(n->left, pls);       if (le.first == inf) continue;       auto ri = f(n->right, p - pls - 1);       if (ri.first == inf) continue;       vector<int> a = {le.first, le.second};       vector<int> b = {ri.first, ri.second};       for (int i = 0; i < 2; i++)         for (int j = 0; j < 2; j++) {           int res = a[i] + b[j];           chmin(mi, res);           chmax(ma, res);         }     }     for (int pls = 0; pls < p + 1; pls++) {       auto le = f(n->left, pls);       if (le.first == inf) continue;       auto ri = f(n->right, p - pls);       if (ri.first == inf) continue;       vector<int> a = {le.first, le.second};       vector<int> b = {ri.first, ri.second};       for (int i = 0; i < 2; i++)         for (int j = 0; j < 2; j++) {           int res = a[i] - b[j];           chmin(mi, res);           chmax(ma, res);         }     }     assert(mi != inf);     vis[id][p] = 1;     return memo[id][p] = {mi, ma};   }   pair<int, int> g(Node *n, int p) {     int m = n->cnt - p;     if (m < 0) return {inf, inf};     int id = n->id;     if (vis[id][p]) return memo[id][p];     if (n->cnt == 0) return memo[id][p] = {n->value, n->value};     int mi = inf, ma = -inf;     for (int pls = 0; pls < p; pls++) {       auto le = g(n->left, pls);       if (le.first == inf) continue;       auto ri = g(n->right, p - pls - 1);       if (ri.first == inf) continue;       vector<int> a = {le.first, le.second};       vector<int> b = {ri.first, ri.second};       for (int i = 0; i < 2; i++)         for (int j = 0; j < 2; j++) {           int res = a[i] - b[j];           chmin(mi, res);           chmax(ma, res);         }     }     for (int pls = 0; pls < p + 1; pls++) {       auto le = g(n->left, pls);       if (le.first == inf) continue;       auto ri = g(n->right, p - pls);       if (ri.first == inf) continue;       vector<int> a = {le.first, le.second};       vector<int> b = {ri.first, ri.second};       for (int i = 0; i < 2; i++)         for (int j = 0; j < 2; j++) {           int res = a[i] + b[j];           chmin(mi, res);           chmax(ma, res);         }     }     assert(mi != inf);     vis[id][p] = 1;     return memo[id][p] = {mi, ma};   }   void _main() {     cin >> E >> P >> M;     E +=  = ;     Node *root = parse();     if (P <= M) {       auto res = f(root, P);       int ans = res.second;       cout << ans << endl;     } else {       auto res = g(root, M);       int ans = res.second;       cout << ans << endl;     }   }