Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Слава Україні, Героям слава
- #include <bits/stdc++.h>
- using namespace std;
- map<string, int> mp;
- vector<vector<string>> k;
- int main() {
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- freopen("in.txt", "r", stdin);
- freopen("out.txt", "w", stdout);
- string ss;
- while(true) {
- getline(cin, ss);
- if(ss == "done") break;
- vector<string> v;
- string t;
- stringstream X(ss);
- while(getline(X, t, ' ')) {
- v.push_back(t);
- }
- string ref = v.front();
- v.erase(v.begin());
- mp[ref] = k.size();
- k.push_back(v);
- }
- function<string(string)> parse = [&](string y) {
- if(y.find(':') == string::npos) {
- return y;
- }
- int ind = 0;
- for(int i = 0; i < (int)y.size(); i++) {
- if(y[i] == ':') {
- ind = i;
- break;
- }
- }
- string l = y.substr(0, ind), r = y.substr(ind + 1);
- return r;
- };
- mp["A"] = -1;
- mp["R"] = -2;
- vector<array<int, 8>> v;
- function<void(int, int, int, int, int, int, int, int, int)> dfs = [&](int lx, int rx, int lm, int rm, int la, int ra, int ls, int rs, int cur) {
- if(lx > rx or lm > rm or la > ra or ls > rs) return;
- if(cur == -2) return;
- if(cur == -1) {
- v.push_back({ lx, rx, lm, rm, la, ra, ls, rs });
- return;
- }
- for(auto e : k[cur]) {
- string res = parse(e);
- if(e.find(':') == string::npos) {
- dfs(lx, rx, lm, rm, la, ra, ls, rs, mp[res]);
- return;
- }
- while(e.back() != ':') {
- e.pop_back();
- }
- e.pop_back();
- string l = e;
- char val = l.front();
- l.erase(l.begin());
- int k = stoi(l.substr(1));
- if (l.front() == '>') {
- if (val == 'x') {
- dfs(max(k + 1, lx), rx, lm, rm, la, ra, ls, rs, mp[res]);
- rx = min(rx, k);
- } else if(val == 'm') {
- dfs(lx, rx, max(k + 1, lm), rm, la, ra, ls, rs, mp[res]);
- rm = min(rm, k);
- } else if(val == 'a') {
- dfs(lx, rx, lm, rm, max(k + 1, la), ra, ls, rs, mp[res]);
- ra = min(ra, k);
- } else {
- dfs(lx, rx, lm, rm, la, ra, max(k + 1, ls), rs, mp[res]);
- rs = min(rs, k);
- }
- } else {
- if (val == 'x') {
- dfs(lx, min(k - 1, rx), lm, rm, la, ra, ls, rs, mp[res]);
- lx = max(lx, k);
- } else if(val == 'm') {
- dfs(lx, rx, lm, min(k - 1, rm), la, ra, ls, rs, mp[res]);
- lm = max(lm, k);
- } else if(val == 'a') {
- dfs(lx, rx, lm, rm, la, min(k - 1, ra), ls, rs, mp[res]);
- la = max(la, k);
- } else {
- dfs(lx, rx, lm, rm, la, ra, ls, min(k - 1, rs), mp[res]);
- ls = max(ls, k);
- }
- }
- }
- };
- dfs(1, 4000, 1, 4000, 1, 4000, 1, 4000, mp["in"]);
- long long ans = 0;
- for(int i = 0; i < (int)v.size(); i++) {
- long long tmp = 1;
- for(int j = 1; j < 8; j += 2) {
- tmp *= (v[i][j] - v[i][j - 1] + 1);
- }
- ans += tmp;
- }
- cout << ans << "\n";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement