Submission #828576

#TimeUsernameProblemLanguageResultExecution timeMemory
828576AlphaMale06Sterilizing Spray (JOI15_sterilizing)C++14
100 / 100
221 ms8128 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
int k;
const int N = 100005;

ll st[4*N][2];
ll a[N];

void Build(int node, int l, int r){
    if(l>r)return;
    if(l==r){
        st[node][0]=a[l]; st[node][1]=a[l];
        return;
    }
    int mid=(l+r)/2;
    Build(2*node+1, l, mid);
    Build(2*node+2, mid+1, r);
    st[node][0]=st[2*node+1][0]+st[2*node+2][0];
    st[node][1]=max(st[2*node+1][1], st[2*node+2][1]);
}

void Update(int node, int l, int r, int ind, int val){
    if(l>r || l >ind || r<ind)return;
    if(l==r){
        st[node][0]=val;
        st[node][1]=val;
        return;
    }
    int mid=(l+r)/2;
    Update(2*node+1, l, mid, ind, val);
    Update(2*node+2, mid+1, r, ind, val);
    st[node][0]=st[2*node+1][0]+st[2*node+2][0];
    st[node][1]=max(st[2*node+1][1], st[2*node+2][1]);
}

ll Get(int node, int l, int r, int L, int R){
    if(l>r || l>R || r<L)return 0;
    if(L<=l && R>=r)return st[node][0];
    int mid=(l+r)/2;
    return Get(2*node+1, l, mid, L, R)+Get(2*node+2, mid+1, r, L, R);
}

void Spray(int node, int l, int r, int L, int R){
    if(l>r || l>R || r<L)return;
    if(L<=l && R>=r){
        if(l==r){
            st[node][0]/=k;
            st[node][1]/=k;
            return;
        }
        if(st[node][1]>0){
            int mid=(l+r)/2;
            Spray(2*node+1, l, mid, L, R);
            Spray(2*node+2, mid+1, r, L, R);
            st[node][0]=st[2*node+1][0]+st[2*node+2][0];
            st[node][1]=max(st[2*node+1][1], st[2*node+2][1]);
        }
        return;
    }
    int mid = (l+r)/2;
    Spray(2*node+1, l, mid, L, R);
    Spray(2*node+2, mid+1, r, L, R);
    st[node][0]=st[2*node+1][0]+st[2*node+2][0];
    st[node][1]=max(st[2*node+1][1], st[2*node+2][1]);
}

int main()
{
    ios_base::sync_with_stdio(0); cin.tie(0);
    int n, q;
    cin >> n >> q >> k;
    for(int i=0; i< n; i++)cin >> a[i];
    Build(0, 0, n-1);
    while(q--){
        int t;
        cin >> t;
        if(t==1){
            int ind, val;
            cin >> ind >> val;
            Update(0, 0, n-1, ind-1, val);
        }
        if(t==2){
            int l, r;
            cin >> l >> r;
            if(k!=1){
                Spray(0, 0, n-1, l-1, r-1);
            }
        }
        if(t==3){
            int l, r;
            cin >> l >> r;
            cout << Get(0, 0, n-1, l-1, r-1) << '\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...