Submission #1369514

#TimeUsernameProblemLanguageResultExecution timeMemory
1369514gohchingjaykSnacks (NOI25_snacks)C++20
100 / 100
769 ms140100 KiB
#include <bits/stdc++.h>

using ll = long long;
using namespace std;

#define int ll

int n, q;
int a[200000 + 5];
int x[200000 + 5];
int l[200000 + 5];
int r[200000 + 5];
int mp[800000 + 5];

void discretise() {
    vector<int> disc;

    for (int i = 0; i < n; ++i) disc.emplace_back(a[i]);
    for (int i = 0; i < q; ++i) {
        disc.emplace_back(x[i]);
        disc.emplace_back(l[i]);
        disc.emplace_back(r[i]);
    }

    sort(disc.begin(), disc.end());
    unique(disc.begin(), disc.end());

    for (int i = 0; i < n; ++i) {
        int orig = a[i];
        a[i] = lower_bound(disc.begin(), disc.end(), orig) - disc.begin();
        mp[a[i]] = orig;
    }

    for (int i = 0; i < q; ++i) {
        int orig = x[i];
        x[i] = lower_bound(disc.begin(), disc.end(), orig) - disc.begin();
        mp[x[i]] = orig;
    }

    for (int i = 0; i < q; ++i) {
        int orig = l[i];
        l[i] = lower_bound(disc.begin(), disc.end(), orig) - disc.begin();
        mp[l[i]] = orig;
    }

    for (int i = 0; i < q; ++i) {
        int orig = r[i];
        r[i] = lower_bound(disc.begin(), disc.end(), orig) - disc.begin();
        mp[r[i]] = orig;
    }
}

struct Node {
    int l, r, m;
    Node *left = nullptr, *right = nullptr;
    bool lazy = false;
    int val = 0, val2 = 0;

    Node(int a, int b) {
        l = a, r = b, m = (l + r) / 2;
        if (a != b) {
            left = new Node(l, m);
            right = new Node(m + 1, r);
        }
    }

    void prop() {
        if (l == r) return;
        if (!lazy) return;
        lazy = false;
        left->val = 0;
        right->val = 0;
        left->val2 = 0;
        right->val2 = 0;
        left->lazy = true;
        right->lazy = true;
    }

    void range_zero(int a, int b) {
        if (r < a || b < l) {
            return;
        }

        if (a <= l && r <= b) {
            lazy = true;
            val = 0;
            val2 = 0;
            return;
        }

        prop();

        left->range_zero(a, b);
        right->range_zero(a, b);
        val = left->val + right->val;
        val2 = left->val2 + right->val2;
    }

    void point_update(int p, int v) {
        if (l == r) {
            val += v;
            val2 += v * mp[l];
            return;
        }

        prop();

        if (p <= m) left->point_update(p, v);
        else right->point_update(p, v);
        val = left->val + right->val;
        val2 = left->val2 + right->val2;
    }

    int range_sum(int a, int b) {
        if (r < a || b < l) {
            return 0;
        }

        if (a <= l && r <= b) {
            return val;
        }

        prop();

        return left->range_sum(a, b) + right->range_sum(a, b);
    }
};

Node *root;

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    cin >> n >> q;
    for (int i = 0; i < n; ++i) cin >> a[i];
    for (int i = 0; i < q; ++i) cin >> l[i] >> r[i] >> x[i];

    discretise();

    root = new Node(0, 800000 + 5);

    for (int i = 0; i < n; ++i) {
        root->point_update(a[i], 1);
    }

    cout << root->val2 << '\n';

    for (int i = 0; i < q; ++i) {
        int num = root->range_sum(l[i], r[i]);
        root->range_zero(l[i], r[i]);
        root->point_update(x[i], num);
        cout << root->val2 << '\n';
    }
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...