제출 #1133526

#제출 시각아이디문제언어결과실행 시간메모리
1133526MunkhturErdenebatSterilizing Spray (JOI15_sterilizing)C++20
0 / 100
5094 ms3864 KiB
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

const int MAXN = 100005;

struct SegmentTree {
    vector<long long> tree, lazy;
    int n;

    SegmentTree(int size) : n(size) {
        tree.assign(4 * n, 0);
        lazy.assign(4 * n, 0);
    }

    void build(const vector<int>& arr, int node, int start, int end) {
        if (start == end) {
            tree[node] = arr[start];
        } else {
            int mid = (start + end) / 2;
            build(arr, 2 * node, start, mid);
            build(arr, 2 * node + 1, mid + 1, end);
            tree[node] = tree[2 * node] + tree[2 * node + 1];
        }
    }

    void propagate(int node, int start, int end) {
        if (lazy[node] != 0) {
            tree[node] = lazy[node] * (end - start + 1);
            if (start != end) {
                lazy[2 * node] = lazy[node];
                lazy[2 * node + 1] = lazy[node];
            }
            lazy[node] = 0;
        }
    }

    void updateRange(int l, int r, int value, int node, int start, int end) {
        propagate(node, start, end);

        if (start > end || start > r || end < l)
            return;

        if (start >= l && end <= r) {
            lazy[node] = value;
            propagate(node, start, end);
            return;
        }

        int mid = (start + end) / 2;
        updateRange(l, r, value, 2 * node, start, mid);
        updateRange(l, r, value, 2 * node + 1, mid + 1, end);
        tree[node] = tree[2 * node] + tree[2 * node + 1];
    }

    long long queryRange(int l, int r, int node, int start, int end) {
        propagate(node, start, end);

        if (start > end || start > r || end < l)
            return 0;

        if (start >= l && end <= r)
            return tree[node];

        int mid = (start + end) / 2;
        return queryRange(l, r, 2 * node, start, mid) +
               queryRange(l, r, 2 * node + 1, mid + 1, end);
    }
};

int main() {
    int N, Q, K;
    cin >> N >> Q >> K;

    vector<int> bacteria(N + 1);
    for (int i = 1; i <= N; ++i) {
        cin >> bacteria[i];
    }

    SegmentTree segTree(N);
    segTree.build(bacteria, 1, 1, N);

    vector<long long> results;

    for (int i = 0; i < Q; ++i) {
        int op;
        cin >> op;

        if (op == 1) {
            int a, b;
            cin >> a >> b;
            segTree.updateRange(a, a, b, 1, 1, N);
        } else if (op == 2) {
            int l, r;
            cin >> l >> r;
            for (int j = l; j <= r; ++j) {
                long long current = segTree.queryRange(j, j, 1, 1, N);
                segTree.updateRange(j, j, current / K, 1, 1, N);
            }
        } else if (op == 3) {
            int l, r;
            cin >> l >> r;
            results.push_back(segTree.queryRange(l, r, 1, 1, N));
        }
    }

    for (auto res : results) {
        cout << res << endl;
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...