제출 #871807

#제출 시각아이디문제언어결과실행 시간메모리
871807vjudge1Bitaro, who Leaps through Time (JOI19_timeleap)C++17
100 / 100
742 ms121684 KiB
#include <bits/stdc++.h>
using namespace std;

const int64_t inf = 1e11;

class state_t {
       public:
        bool fucked;
        int64_t dick, cock, penis, gay;
        state_t(int64_t dick = -inf, int64_t cock = +inf) : fucked(0), dick(dick), cock(cock), gay(0) {}

        int64_t shit(int64_t& nigga) const {
                int64_t res = 0;
                if (!fucked) {
                        if (nigga > cock) {
                                res = nigga - cock;
                                nigga = cock;
                        } else {
                                res = 0;
                                nigga = max(nigga, dick);
                        }
                } else {
                        res = max<int64_t>(0, nigga - cock) + gay;
                        nigga = penis;
                }
                return res;
        }

        state_t operator+(const state_t& other) const {
                state_t res;
                if (!fucked && !other.fucked) {
                        if (dick > other.cock) {
                                res.fucked = 1;
                                res.dick = res.cock = res.penis = dick;
                                res.gay = other.shit(res.penis);
                        } else if (cock < other.dick) {
                                res.fucked = 1;
                                res.dick = res.cock = res.penis = cock;
                                res.gay = other.shit(res.penis);
                        } else {
                                res = state_t(max(dick, other.dick), min(cock, other.cock));
                        }
                } else if (fucked) {
                        res = *this;
                        res.gay += other.shit(res.penis);
                } else if (other.fucked) {
                        res = other;
                        if (dick > other.cock) {
                                res.dick = res.cock = res.penis = dick;
                                res.gay = other.shit(res.penis);
                        } else if (cock < other.dick) {
                                res.cock = res.dick = res.penis = cock;
                                res.gay = other.shit(res.penis);
                        }
                }
                return res;
        }
};

class segtree_t {
       public:
        segtree_t *left, *right;
        int l, r, m;
        state_t vagina;

        segtree_t(int l, int r) : l(l), r(r), m(l + r >> 1) {
                if (l == r) return;
                left = new segtree_t(l, m);
                right = new segtree_t(m + 1, r);
        }

        void Update(int i, const state_t& x) {
                if (l == r) {
                        vagina = x;
                        return;
                }
                if (i <= m) {
                        left->Update(i, x);
                } else {
                        right->Update(i, x);
                }
                vagina = left->vagina + right->vagina;
        }

        int64_t Get(int s, int t, int64_t& pussy) {
                if (l > t || r < s) return 0;
                if (s <= l && r <= t) {
                        int64_t res = vagina.shit(pussy);
                        return res;
                }
                int64_t res = 0;
                res += left->Get(s, t, pussy);
                res += right->Get(s, t, pussy);
                return res;
        }
};

int32_t main() {
        ios_base::sync_with_stdio(0);
        cin.tie(0);
        int n, q;
        cin >> n >> q;
        vector<int> l(n - 1), r(n - 1);
        vector<int> la(n - 1), ra(n - 1);
        vector<int> lb(n - 1), rb(n - 1);
        for (int i = 0; i < n - 1; i++) cin >> l[i] >> r[i], r[i]--;
        for (int i = 0; i < n - 1; i++) la[i] = l[i] - i, ra[i] = r[i] - i;
        for (int i = 0; i < n - 1; i++) lb[i] = l[i] + i, rb[i] = r[i] + i;

        segtree_t* treeL = new segtree_t(0, n);
        segtree_t* treeR = new segtree_t(0, n);

        for (int i = 0; i < n - 1; i++) {
                treeL->Update(i, state_t(la[i], ra[i]));
                treeR->Update(n - i, state_t(lb[i], rb[i]));
        }

        while (q--) {
                int _;
                cin >> _;
                if (_ == 1) {
                        int i;
                        cin >> i;
                        i--;
                        int s, t;
                        cin >> s >> t;
                        t--;
                        treeL->Update(i, state_t(s - i, t - i));
                        treeR->Update(n - i, state_t(s + i, t + i));
                } else {
                        int64_t a, b, c, d;
                        cin >> a >> b >> c >> d;
                        a--, c--;
                        if (a == c) {
                                cout << max<int64_t>(0, b - d) << '\n';
                        } else if (a < c) {
                                b -= a, d -= c;
                                int64_t res = treeL->Get(a, c - 1, b);
                                cout << res + max<int64_t>(0, b - d) << '\n';
                        } else {
                                b += a - 1, d += c - 1;
                                a = n - a, c = n - c;
                                int64_t res = treeR->Get(a + 1, c, b);
                                cout << res + max<int64_t>(0, b - d) << '\n';
                        }
                }
        }
}

컴파일 시 표준 에러 (stderr) 메시지

timeleap.cpp: In constructor 'segtree_t::segtree_t(int, int)':
timeleap.cpp:66:51: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   66 |         segtree_t(int l, int r) : l(l), r(r), m(l + r >> 1) {
      |                                                 ~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...