제출 #102393

#제출 시각아이디문제언어결과실행 시간메모리
102393Alexa2001Sterilizing Spray (JOI15_sterilizing)C++17
100 / 100
317 ms5848 KiB
#include <bits/stdc++.h>
#define left_son (node<<1)
#define right_son ((node<<1)|1)
#define mid ((st+dr)>>1)


using namespace std;

/// 17:27

const int Nmax = 1e5 + 5;
typedef long long ll;


int C[Nmax], n, K;


class ST
{
    ll a[Nmax<<2];

public:
    void update(int node, int st, int dr, int pos, int val)
    {
        if(st == dr)
        {
            a[node] = val;
            return;
        }
        if(pos <= mid) update(left_son, st, mid, pos, val);
            else update(right_son, mid+1, dr, pos, val);

        a[node] = a[left_son] + a[right_son];
    }

    void init(int node, int st, int dr)
    {
        if(st == dr)
        {
            a[node] = C[st];
            return;
        }

        init(left_son, st, mid);
        init(right_son, mid+1, dr);

        a[node] = a[left_son] + a[right_son];
    }

    void spray(int node, int st, int dr, int L, int R)
    {
        if(!a[node]) return;
        if(R < st || dr < L) return;

        if(st == dr)
        {
            a[node] /= K;
            return;
        }

        spray(left_son, st, mid, L, R);
        spray(right_son, mid+1, dr, L, R);

        a[node] = a[left_son] + a[right_son];
    }

    ll query(int node, int st, int dr, int L, int R)
    {
        if(L <= st && dr <= R) return a[node];

        ll x = 0, y = 0;
        if(L <= mid) x = query(left_son, st, mid, L, R);
        if(mid < R) y = query(right_son, mid+1, dr, L, R);

        return x + y;
    }

} aint;

int main()
{
  //  freopen("input", "r", stdin);
    cin.sync_with_stdio(false);

    int i, x, y, tip, q;

    cin >> n >> q >> K;
    for(i=1; i<=n; ++i) cin >> C[i];

    aint.init(1, 1, n);

    while(q--)
    {
        cin >> tip >> x >> y;
        if(tip == 1) aint.update(1, 1, n, x, y);
            else if(tip == 2 && K > 1) aint.spray(1, 1, n, x, y);
                else if(tip == 3) cout << aint.query(1, 1, n, x, y) << '\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...