제출 #1239351

#제출 시각아이디문제언어결과실행 시간메모리
1239351eirinayukariSterilizing Spray (JOI15_sterilizing)C++20
100 / 100
120 ms7496 KiB
// XD XD
#include <bits/stdc++.h>

#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define el cout << "\n";

using namespace std;
using ll = long long;

const int MAXN = 1e6 + 7;
const int MOD = 1e9 + 7;
const int INF = 1e9 + 7;
const ll LLINF = 1e18 + 7;

template <typename T>
bool ckmin(T& a, T b) {
    return a > b ? a = b, true : false;
}

template <typename T>
bool ckmax(T& a, T b) {
    return a < b ? a = b, true : false;
}

struct segmentTree {
    struct Node {
        ll sum;
        int mx;
        Node(ll _sum = 0, int _mx = 0) {
            sum = _sum;
            mx = _mx;
        }

        Node operator+(const Node &other) {
            Node res;
            res.sum = sum + other.sum;
            res.mx = max(mx, other.mx);
            return res;
        }
    };
    
    int n;
    vector<Node> tree;
    segmentTree(int _n, vector<int> &a) {
        n = _n; 
        tree.resize(4 * n + 1);
        build(a);
    }

    void build(int id, int l, int r, vector<int> &a) {
        if (l == r) {
            tree[id] = Node(a[l], a[l]);
            return;
        }

        int mid = l + r >> 1;
        build(id << 1, l, mid, a);
        build(id << 1 | 1, mid + 1, r, a);
        tree[id] = tree[id << 1] + tree[id << 1 | 1];
    }

    void build(vector<int> &a) {
        build(1, 1, n, a);
    }

    void update(int id, int l, int r, int u, int v, int k) {
        if (l > v || u > r) {
            return;
        }

        if (u <= l && r <= v) {
            if (tree[id].mx == 0) {
                return;
            }

            if (l == r) {
                int g = tree[id].mx;
                g /= k;
                tree[id] = Node(g, g);
                return;
            }
        }

        int mid = l + r >> 1;
        update(id << 1, l, mid, u, v, k);
        update(id << 1 | 1, mid + 1, r, u, v, k);
        tree[id] = tree[id << 1] + tree[id << 1 | 1];
    }
    
    void update(int l, int r, int k) {
        update(1, 1, n, l, r, k);
    }

    void updateAssign(int id, int l, int r, int p, int v) {
        if (l == r) {
            tree[id] = Node(v, v);
            return;
        }

        int mid = l + r >> 1;
        if (p <= mid) {
            updateAssign(id << 1, l, mid, p, v);
        } else {
            updateAssign(id << 1 | 1, mid + 1, r, p, v);
        }
        tree[id] = tree[id << 1] + tree[id << 1 | 1];
    }

    void updateAssign(int p, int v) {
        updateAssign(1, 1, n, p, v);
    }

    ll get(int id, int l, int r, int u, int v) {
        if (l > v || u > r) {
            return 0;
        }

        if (u <= l && r <= v) {
            return tree[id].sum;
        }

        int mid = l + r >> 1;
        ll L = get(id << 1, l, mid, u, v);
        ll R = get(id << 1 | 1, mid + 1, r, u, v);
        return L + R;
    }

    ll get(int l, int r) {
        return get(1, 1, n, l, r);
    }
};

void solve(int id) {
    // cout << "Case " << id << ": ";
    int n, q, k;
    cin >> n >> q >> k;
    vector<int> a(n + 1);
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }

    segmentTree st(n, a);
    while (q--) {
        int type, x, y;
        cin >> type >> x >> y;
        if (type == 1) {
            st.updateAssign(x, y);
        } else if (type == 2) {
            if (k != 1) {
                st.update(x, y, k);
            }
        } else {
            cout << st.get(x, y) << "\n";
        }
    }
}
 
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
 
    int T = 1;
    // cin >> T;
    for (int i = 1; i <= T; i++) {
        solve(i);
    }
    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...