#include <bits/stdc++.h>
using namespace std;
using un = long long;
using vuc = vector<un>;
using vol = vector<bool>;
#define REP(i, a, b) for (un i = (un)a; i < (un)b; i++)
#define FEAC(i, a) for (auto i : a)
#define vec vector
#define ALL(x) (x).begin(), (x).end()
#define MAX 0
#define MIN 1
tuple<un, un, un> leaf = {0, 0, 1};
struct Node {
bool isReady = false;
tuple<un, un, un> levy;
bool typ;
Node(bool t) : typ(t) {}
void setLeft(tuple<un, un, un> l){
levy = l;
isReady = true;
}
tuple<un, un, un> eval(tuple<un, un, un> pravy){
auto [X1, X2, N] = levy;
auto [Y1, Y2, M] = pravy;
un K = N+M;
un A, B;
if (typ == MIN){
A = min(X1, Y1);
B = X2 + Y2;
}
else if (typ == MAX){
un X3 = N-X2-1;
un Y3 = M-Y2-1;
A = K - (N-X1-1) - (M-Y1-1) - 1;
B = K - min(N-X2-1, M-Y1-1) - 1;
}
return {A, B, K};
}
};
int main(){
stack<Node> zasoba;
tuple<un, un, un> ret;
do {
char c, trash;
cin >> c;
while((c == ')') or (c == ',')) cin >> c;
if (c == '?') {
tuple<un, un, un> curr = leaf;
while((not zasoba.empty()) and (zasoba.top().isReady)){
curr = zasoba.top().eval(curr); zasoba.pop();
}
if (zasoba.empty()) ret = curr;
else {
zasoba.top().setLeft(curr);
}
}
else if (c == 'm'){
cin >> c >> trash >> trash;
if (c == 'a') zasoba.emplace(MAX);
else zasoba.emplace(MIN);
}
} while (not zasoba.empty());
auto [X, Y, ignore] = ret;
cout << (Y-X) + 1 << endl;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |