Submission #728464

# Submission time Handle Problem Language Result Execution time Memory
728464 2023-04-22T12:47:53 Z piOOE Food Court (JOI21_foodcourt) C++17
41 / 100
1000 ms 44720 KB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

namespace SegmentTree {
    struct Info {
        ll sum = 0, mn = 0, mn2 = 3e18;
        int cntmn = 0, len = 0;
    };

    Info operator+(const Info &a, const Info &b) {
        Info res{};
        res.sum = a.sum + b.sum, res.len = a.len + b.len;
        res.mn = min(a.mn, b.mn);
        res.mn2 = min(a.mn == res.mn ? a.mn2 : a.mn, b.mn == res.mn ? b.mn2 : b.mn);
        res.cntmn = (a.mn == res.mn) * a.cntmn + (b.mn == res.mn) * b.cntmn;
        return res;
    }

    vector<Info> t;
    vector<ll> tag;
    int sz = 1;

    void pull(int x) {
        t[x] = t[x << 1] + t[x << 1 | 1];
    }

    void applyAdd(int x, ll tg) {
        tag[x] += tg;
        t[x].sum += t[x].len * tg;
        t[x].mn += tg, t[x].mn2 += tg;
    }

    void applyMin(int x, ll d) {
        if (t[x].mn < d) {
            assert(t[x].mn2 > d);
            t[x].sum += t[x].cntmn * (d - t[x].mn);
            t[x].mn = d;
        }
    }

    void push(int x) {
        if (tag[x]) {
            applyAdd(x << 1, tag[x]);
            applyAdd(x << 1 | 1, tag[x]);
            tag[x] = 0;
        }
        applyMin(x << 1, t[x].mn);
        applyMin(x << 1 | 1, t[x].mn);
    }

    void init(int n) {
        sz = 1 << __lg(n) + !!(n & (n - 1));
        t.assign(sz << 1, {}), tag.assign(sz << 1, {});

        for (int i = 0; i < n; ++i) {
            t[i + sz].cntmn = t[i + sz].len = 1;
        }
        for (int i = sz - 1; i > 0; --i) {
            pull(i);
        }
    }

    void rangeAdd(int l, int r, ll d, int x, int lx, int rx) {
        if (lx >= r || l >= rx) {
            return;
        }
        if (l <= lx && rx <= r) {
            return applyAdd(x, d);
        }
        push(x);
        int mid = (lx + rx) >> 1;
        rangeAdd(l, r, d, x << 1, lx, mid), rangeAdd(l, r, d, x << 1 | 1, mid, rx);
        pull(x);
    }

    void rangeSetMax(int l, int r, ll d, int x = 1, int lx = 0, int rx = sz) {
        if (l >= rx || lx >= r || t[x].mn >= d) {
            return;
        }
        if (l <= lx && rx <= r && t[x].mn2 > d) {
            return applyMin(x, d);
        }
        push(x);
        int mid = lx + rx >> 1;
        rangeSetMax(l, r, d, x << 1, lx, mid), rangeSetMax(l, r, d, x << 1 | 1, mid, rx);
        pull(x);
    }

    void rangeAdd(int l, int r, ll d) {
        rangeAdd(l, r, d, 1, 0, sz);
        rangeSetMax(0, sz, 0);
    }

    ll sum(int i, int x = 1, int lx = 0, int rx = sz) {
        while (x < sz) {
            push(x);
            int mid = lx + rx >> 1;
            if (i < mid) {
                x = x << 1;
                rx = mid;
            } else {
                x = x << 1 | 1;
                lx = mid;
            }
        }
        return t[x].sum;
    }
}

template<typename T>
struct Fenwick {
    int n;
    vector<T> a;

    Fenwick() = default;
    explicit Fenwick(int n) : n(n), a(n + 1) {}

    void modify(int x, T v) {
        for (int i = x + 1; i <= n; i += i & -i) {
            a[i] += v;
        }
    }

    void modify(int l, int r, T v) {
        if (l >= r) return;
        modify(l, v), modify(r, -v);
    }

    T sum(int x) {
        T ans = 0;
        for (int i = x + 1; i > 0; i -= i & -i) {
            ans += a[i];
        }
        return ans;
    }
};


constexpr int N = 2.5e5 + 10;

vector<int> que[N];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m, q;
    cin >> n >> m >> q;

    struct Query {
        int t, l, r, c;
        ll k;
    };
    vector<Query> queries(q);

    vector<int> L(q, -1), R(q, -1);
    vector<ll> aim(q);
    vector<int> pos, pp(q, -1);

    Fenwick<ll> fn(n);
    SegmentTree::init(n);

    for (int i = 0; i < q; ++i) {
        cin >> queries[i].t;

        if (queries[i].t == 1) {
            cin >> queries[i].l >> queries[i].r >> queries[i].c >> queries[i].k;
            pp[i] = pos.size();
            pos.push_back(i);
        } else if (queries[i].t == 2) {
            cin >> queries[i].l >> queries[i].r >> queries[i].k;
            pp[i] = pos.size();
            pos.push_back(i);
        } else {
            cin >> queries[i].l >> queries[i].k;
        }

        queries[i].l -= 1;

        if (queries[i].t == 1) {
            SegmentTree::rangeAdd(queries[i].l, queries[i].r, queries[i].k);
        } else if (queries[i].t == 2) {
            SegmentTree::rangeAdd(queries[i].l, queries[i].r, -queries[i].k);
            fn.modify(queries[i].l, queries[i].r, queries[i].k);
        } else {
            ll s = fn.sum(queries[i].l);
            ll have = SegmentTree::sum(queries[i].l) + s;
            ll need = queries[i].k + s;

            if (have >= need) {
                if (m == 1) {
                    R[i] = -2;
                } else {
                    R[i] = pos.size() - 1;
                    aim[i] = need;
                }
            } else {
                R[i] = -1;
            }
        }
    }

    int cnt = 0;
    while (true) {
        assert(++cnt <= 30);

        for (int i = 0; i < q; ++i) {
            que[i].clear();
        }

        bool found = false;

        for (int i = 0; i < q; ++i) {
            if (L[i] + 1 < R[i]) {
                found = true;
                que[pos[L[i] + R[i] >> 1]].push_back(i);
            }
        }

        if (!found) {
            break;
        }

        fn = Fenwick<ll>(n);
        SegmentTree::init(n);

        for (int i = 0; i < q; ++i) {
            if (queries[i].t == 1) {
                SegmentTree::rangeAdd(queries[i].l, queries[i].r, queries[i].k);
            } else if (queries[i].t == 2) {
                SegmentTree::rangeAdd(queries[i].l, queries[i].r, -queries[i].k);
                fn.modify(queries[i].l, queries[i].r, queries[i].k);
            }

            for (int j : que[i]) {
                ll need = aim[j];
                ll have = SegmentTree::sum(queries[j].l) + fn.sum(queries[j].l);

                if (have >= need) {
                    R[j] = pp[i];
                } else {
                    L[j] = pp[i];
                }
            }
        }
    }

    for (int i = 0; i < q; ++i) {
        if (queries[i].t == 3) {
            if (R[i] == -1) {
                cout << 0 << '\n';
            } else if (R[i] >= 0) {
                cout << queries[pos[R[i]]].c << '\n';
            } else {
                cout << 1 << '\n';
            }
        }
    }


    return 0;
}

Compilation message

foodcourt.cpp: In function 'void SegmentTree::init(int)':
foodcourt.cpp:54:27: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
   54 |         sz = 1 << __lg(n) + !!(n & (n - 1));
      |                   ~~~~~~~~^~~~~~~~~~~~~~~~~
foodcourt.cpp: In function 'void SegmentTree::rangeSetMax(int, int, ll, int, int, int)':
foodcourt.cpp:86:22: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   86 |         int mid = lx + rx >> 1;
      |                   ~~~^~~~
foodcourt.cpp: In function 'll SegmentTree::sum(int, int, int, int)':
foodcourt.cpp:99:26: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   99 |             int mid = lx + rx >> 1;
      |                       ~~~^~~~
foodcourt.cpp: In function 'int main()':
foodcourt.cpp:218:30: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  218 |                 que[pos[L[i] + R[i] >> 1]].push_back(i);
# Verdict Execution time Memory Grader output
1 Correct 13 ms 6484 KB Output is correct
2 Correct 17 ms 6460 KB Output is correct
3 Correct 11 ms 6456 KB Output is correct
4 Correct 16 ms 6460 KB Output is correct
5 Correct 6 ms 6356 KB Output is correct
6 Correct 5 ms 6228 KB Output is correct
7 Correct 17 ms 6456 KB Output is correct
8 Correct 17 ms 6484 KB Output is correct
9 Correct 21 ms 6484 KB Output is correct
10 Correct 17 ms 6456 KB Output is correct
11 Correct 18 ms 6484 KB Output is correct
12 Correct 19 ms 6456 KB Output is correct
13 Correct 10 ms 6480 KB Output is correct
14 Correct 9 ms 6456 KB Output is correct
15 Correct 10 ms 6456 KB Output is correct
16 Correct 13 ms 6484 KB Output is correct
17 Correct 18 ms 6484 KB Output is correct
18 Correct 21 ms 6460 KB Output is correct
19 Correct 12 ms 6484 KB Output is correct
20 Correct 14 ms 6496 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 13 ms 6484 KB Output is correct
2 Correct 17 ms 6460 KB Output is correct
3 Correct 11 ms 6456 KB Output is correct
4 Correct 16 ms 6460 KB Output is correct
5 Correct 6 ms 6356 KB Output is correct
6 Correct 5 ms 6228 KB Output is correct
7 Correct 17 ms 6456 KB Output is correct
8 Correct 17 ms 6484 KB Output is correct
9 Correct 21 ms 6484 KB Output is correct
10 Correct 17 ms 6456 KB Output is correct
11 Correct 18 ms 6484 KB Output is correct
12 Correct 19 ms 6456 KB Output is correct
13 Correct 10 ms 6480 KB Output is correct
14 Correct 9 ms 6456 KB Output is correct
15 Correct 10 ms 6456 KB Output is correct
16 Correct 13 ms 6484 KB Output is correct
17 Correct 18 ms 6484 KB Output is correct
18 Correct 21 ms 6460 KB Output is correct
19 Correct 12 ms 6484 KB Output is correct
20 Correct 14 ms 6496 KB Output is correct
21 Correct 19 ms 6548 KB Output is correct
22 Correct 17 ms 6484 KB Output is correct
23 Correct 15 ms 6484 KB Output is correct
24 Correct 16 ms 6576 KB Output is correct
25 Correct 5 ms 6228 KB Output is correct
26 Correct 5 ms 6228 KB Output is correct
27 Correct 20 ms 6568 KB Output is correct
28 Correct 20 ms 6548 KB Output is correct
29 Correct 19 ms 6484 KB Output is correct
30 Correct 16 ms 6572 KB Output is correct
31 Correct 19 ms 6564 KB Output is correct
32 Correct 22 ms 6484 KB Output is correct
33 Correct 8 ms 6484 KB Output is correct
34 Correct 8 ms 6484 KB Output is correct
35 Correct 12 ms 6484 KB Output is correct
36 Correct 14 ms 6484 KB Output is correct
37 Correct 10 ms 6484 KB Output is correct
38 Correct 13 ms 6464 KB Output is correct
# Verdict Execution time Memory Grader output
1 Execution timed out 1062 ms 16708 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 432 ms 40124 KB Output is correct
2 Correct 366 ms 41148 KB Output is correct
3 Correct 448 ms 44536 KB Output is correct
4 Correct 294 ms 41804 KB Output is correct
5 Correct 291 ms 41628 KB Output is correct
6 Correct 419 ms 44584 KB Output is correct
7 Correct 89 ms 21960 KB Output is correct
8 Correct 87 ms 21960 KB Output is correct
9 Correct 348 ms 44428 KB Output is correct
10 Correct 345 ms 44484 KB Output is correct
11 Correct 434 ms 44572 KB Output is correct
12 Correct 406 ms 44616 KB Output is correct
13 Correct 426 ms 44612 KB Output is correct
14 Correct 478 ms 44608 KB Output is correct
15 Correct 489 ms 44588 KB Output is correct
16 Correct 495 ms 44596 KB Output is correct
17 Correct 523 ms 44600 KB Output is correct
18 Correct 427 ms 44604 KB Output is correct
19 Correct 457 ms 44660 KB Output is correct
20 Correct 458 ms 44632 KB Output is correct
21 Correct 484 ms 44628 KB Output is correct
22 Correct 478 ms 44556 KB Output is correct
23 Correct 490 ms 44636 KB Output is correct
24 Correct 498 ms 44636 KB Output is correct
25 Correct 325 ms 43880 KB Output is correct
26 Correct 336 ms 44588 KB Output is correct
27 Correct 354 ms 44720 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 13 ms 6484 KB Output is correct
2 Correct 17 ms 6460 KB Output is correct
3 Correct 11 ms 6456 KB Output is correct
4 Correct 16 ms 6460 KB Output is correct
5 Correct 6 ms 6356 KB Output is correct
6 Correct 5 ms 6228 KB Output is correct
7 Correct 17 ms 6456 KB Output is correct
8 Correct 17 ms 6484 KB Output is correct
9 Correct 21 ms 6484 KB Output is correct
10 Correct 17 ms 6456 KB Output is correct
11 Correct 18 ms 6484 KB Output is correct
12 Correct 19 ms 6456 KB Output is correct
13 Correct 10 ms 6480 KB Output is correct
14 Correct 9 ms 6456 KB Output is correct
15 Correct 10 ms 6456 KB Output is correct
16 Correct 13 ms 6484 KB Output is correct
17 Correct 18 ms 6484 KB Output is correct
18 Correct 21 ms 6460 KB Output is correct
19 Correct 12 ms 6484 KB Output is correct
20 Correct 14 ms 6496 KB Output is correct
21 Execution timed out 1062 ms 16708 KB Time limit exceeded
22 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 641 ms 17012 KB Output is correct
2 Correct 682 ms 17080 KB Output is correct
3 Correct 831 ms 17344 KB Output is correct
4 Correct 555 ms 16180 KB Output is correct
5 Correct 639 ms 16916 KB Output is correct
6 Correct 737 ms 17344 KB Output is correct
7 Correct 66 ms 10572 KB Output is correct
8 Correct 63 ms 10360 KB Output is correct
9 Correct 359 ms 17320 KB Output is correct
10 Correct 422 ms 15932 KB Output is correct
11 Correct 637 ms 17360 KB Output is correct
12 Correct 652 ms 17288 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 13 ms 6484 KB Output is correct
2 Correct 17 ms 6460 KB Output is correct
3 Correct 11 ms 6456 KB Output is correct
4 Correct 16 ms 6460 KB Output is correct
5 Correct 6 ms 6356 KB Output is correct
6 Correct 5 ms 6228 KB Output is correct
7 Correct 17 ms 6456 KB Output is correct
8 Correct 17 ms 6484 KB Output is correct
9 Correct 21 ms 6484 KB Output is correct
10 Correct 17 ms 6456 KB Output is correct
11 Correct 18 ms 6484 KB Output is correct
12 Correct 19 ms 6456 KB Output is correct
13 Correct 10 ms 6480 KB Output is correct
14 Correct 9 ms 6456 KB Output is correct
15 Correct 10 ms 6456 KB Output is correct
16 Correct 13 ms 6484 KB Output is correct
17 Correct 18 ms 6484 KB Output is correct
18 Correct 21 ms 6460 KB Output is correct
19 Correct 12 ms 6484 KB Output is correct
20 Correct 14 ms 6496 KB Output is correct
21 Correct 19 ms 6548 KB Output is correct
22 Correct 17 ms 6484 KB Output is correct
23 Correct 15 ms 6484 KB Output is correct
24 Correct 16 ms 6576 KB Output is correct
25 Correct 5 ms 6228 KB Output is correct
26 Correct 5 ms 6228 KB Output is correct
27 Correct 20 ms 6568 KB Output is correct
28 Correct 20 ms 6548 KB Output is correct
29 Correct 19 ms 6484 KB Output is correct
30 Correct 16 ms 6572 KB Output is correct
31 Correct 19 ms 6564 KB Output is correct
32 Correct 22 ms 6484 KB Output is correct
33 Correct 8 ms 6484 KB Output is correct
34 Correct 8 ms 6484 KB Output is correct
35 Correct 12 ms 6484 KB Output is correct
36 Correct 14 ms 6484 KB Output is correct
37 Correct 10 ms 6484 KB Output is correct
38 Correct 13 ms 6464 KB Output is correct
39 Execution timed out 1062 ms 16708 KB Time limit exceeded
40 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 13 ms 6484 KB Output is correct
2 Correct 17 ms 6460 KB Output is correct
3 Correct 11 ms 6456 KB Output is correct
4 Correct 16 ms 6460 KB Output is correct
5 Correct 6 ms 6356 KB Output is correct
6 Correct 5 ms 6228 KB Output is correct
7 Correct 17 ms 6456 KB Output is correct
8 Correct 17 ms 6484 KB Output is correct
9 Correct 21 ms 6484 KB Output is correct
10 Correct 17 ms 6456 KB Output is correct
11 Correct 18 ms 6484 KB Output is correct
12 Correct 19 ms 6456 KB Output is correct
13 Correct 10 ms 6480 KB Output is correct
14 Correct 9 ms 6456 KB Output is correct
15 Correct 10 ms 6456 KB Output is correct
16 Correct 13 ms 6484 KB Output is correct
17 Correct 18 ms 6484 KB Output is correct
18 Correct 21 ms 6460 KB Output is correct
19 Correct 12 ms 6484 KB Output is correct
20 Correct 14 ms 6496 KB Output is correct
21 Correct 19 ms 6548 KB Output is correct
22 Correct 17 ms 6484 KB Output is correct
23 Correct 15 ms 6484 KB Output is correct
24 Correct 16 ms 6576 KB Output is correct
25 Correct 5 ms 6228 KB Output is correct
26 Correct 5 ms 6228 KB Output is correct
27 Correct 20 ms 6568 KB Output is correct
28 Correct 20 ms 6548 KB Output is correct
29 Correct 19 ms 6484 KB Output is correct
30 Correct 16 ms 6572 KB Output is correct
31 Correct 19 ms 6564 KB Output is correct
32 Correct 22 ms 6484 KB Output is correct
33 Correct 8 ms 6484 KB Output is correct
34 Correct 8 ms 6484 KB Output is correct
35 Correct 12 ms 6484 KB Output is correct
36 Correct 14 ms 6484 KB Output is correct
37 Correct 10 ms 6484 KB Output is correct
38 Correct 13 ms 6464 KB Output is correct
39 Execution timed out 1062 ms 16708 KB Time limit exceeded
40 Halted 0 ms 0 KB -