제출 #1208713

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

using namespace std;

#define ll long long
#define ld long double
#define u128 unsigned __int128
#define i128 __int128
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define pb push_back
#define eb emplace_back
#define mt make_tuple
#define mp make_pair
#define pii pair<int, int>
#define pll pair<ll, ll>
#define pli pair<ll, int>
#define pil pair<int, ll>
#define ff first
#define ss second

const ll inf = 9e18;
const int iinf = 2e9;
const int N = 1e5;
const ll MOD = 1e9 + 7;

vector<ll> t;

void build(int v, int tl, int tr, vector<int>& a){
    if (tl + 1 == tr){
        t[v] = a[tl];
        return;
    }
    int tm = tl + tr >> 1;
    build(2 * v + 1, tl, tm, a);
    build(2 * v + 2, tm, tr, a);
    t[v] = t[2 * v + 1] + t[2 * v + 2];
}

void upd1(int v, int tl, int tr, int pos, int val){
    if (tl + 1 == tr){
        t[v] = val;
        return;
    }
    int tm = tl + tr >> 1;
    if (pos < tm)
        upd1(2 * v + 1, tl, tm, pos, val);
    else
        upd1(2 * v + 2, tm, tr, pos, val);
    t[v] = t[2 * v + 1] + t[2 * v + 2];
}

void upd2(int v, int tl, int tr, int ql, int qr, int k){
    if (t[v] == 0 || qr <= tl || ql >= tr)
        return;
    if (tl + 1 == tr){
        t[v] /= k;
        return;
    }
    int tm = tl + tr >> 1;
    upd2(2 * v + 1, tl, tm, ql, qr, k);
    upd2(2 * v + 2, tm, tr, ql, qr, k);
    t[v] = t[2 * v + 1] + t[2 * v + 2];
}

ll get(int v, int tl, int tr, int ql, int qr){
    if (qr <= tl || ql >= tr)
        return 0ll;
    if (ql <= tl && tr <= qr)
        return t[v];
    int tm = tl + tr >> 1;
    return get(2 * v + 1, tl, tm, ql, qr) + get(2 * v + 2, tm, tr, ql, qr);
}

void solution(){
    int k, n, q;
    cin >> n >> q >> k;
    vector<int> c(n);
    t.resize(4 * n);
    for (int i = 0; i < n; ++i)
        cin >> c[i];
    build(0, 0, n, c);
    for (int i = 0; i < q; ++i){
        int t, l, r;
        cin >> t >> l >> r;
        --l;
        if (t == 1){
            upd1(0, 0, n, l, r);
        } else if (t == 2){
            if (k != 1)
                upd2(0, 0, n, l, r, k);
        } else{
            cout << get(0, 0, n, l, r) << '\n';
        }
    }
}

signed main(/* Kurmankul Nurislam */){
    //freopen("fcolor.in", "r", stdin);
    //freopen("fcolor.out", "w", stdout);
    cin.tie(nullptr) -> sync_with_stdio(false);
    int t = 1;
    //cin >> t;
    while (t--){
        solution();
        //cout << '\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...