제출 #973804

#제출 시각아이디문제언어결과실행 시간메모리
973804VMaksimoski008Sterilizing Spray (JOI15_sterilizing)C++17
80 / 100
5060 ms10280 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

struct SegTree {
    int n, k;
    vector<int> v;
    vector<ll> sum, mx;

    SegTree(vector<int> _v, int _k) {
        n = _v.size();
        v = _v;
        k = _k;
        sum.resize(4*n+5);
        mx.resize(4*n+5);
        build(1, 0, n-1);
    }

    void merge(int u) {
        sum[u] = sum[2*u] + sum[2*u+1];
        mx[u] = max(mx[2*u], mx[2*u+1]); 
    }

    void build(int u, int tl, int tr) {
        if(tl == tr) {
            sum[u] = mx[u] = v[tl];
        } else {
            int tm = (tl + tr) / 2;
            build(2*u, tl, tm);
            build(2*u+1, tm+1, tr);
            merge(u);
        }
    }

    void set(int u, int tl, int tr, int p, int v) {
        if(tl == tr) {
            sum[u] = mx[u] = v;
        } else {
            int tm = (tl + tr) / 2;
            if(p <= tm) set(2*u, tl, tm, p, v);
            else set(2*u+1, tm+1, tr, p, v);
            merge(u);
        }
    }

    void spray(int u, int tl, int tr, int l, int r) {
        if(tl > tr || l > tr || tl > r || !mx[u]) return ;

        if(tl == tr) {
            sum[u] /= k;
            mx[u] /= k;
            return ;
        }

        int tm = (tl + tr) / 2;
        spray(2*u, tl, tm, l, r);
        spray(2*u+1, tm+1, tr, l, r);
        merge(u);
    }

    ll query(int u, int tl, int tr, int l, int r) {
        if(tl > tr || l > tr || tl > r) return 0;
        if(l <= tl && tr <= r) return sum[u];
        int tm = (tl + tr) / 2;
        return query(2*u, tl, tm, l, r)
        + query(2*u+1, tm+1, tr, l, r);
    }

    ll query(int l, int r) { return query(1, 0, n-1, l, r); }
    void set(int p, int v) { set(1, 0, n-1, p, v); }
    void spray(int l, int r) { spray(1, 0, n-1, l, r); }
};

int main() {
    int n, q, k, t, l, r;
    cin >> n >> q >> k;

    vector<int> v(n);
    for(int &x : v) cin >> x;

    SegTree tree(v, k);

    while(q--) {
        cin >> t >> l >> r;

        if(t == 1) tree.set(l-1, r);
        else if(t == 2) tree.spray(l-1, r-1);
        else cout << tree.query(l-1, r-1) << '\n';
    }

    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...