Submission #1324943

#TimeUsernameProblemLanguageResultExecution timeMemory
1324943madaratSterilizing Spray (JOI15_sterilizing)C++20
20 / 100
175 ms8428 KiB
#include <iostream>
#include <set>
#define endl '\n'

using namespace std;

long long segt[4*100'001];
long long n, k;
long long mas[100'001];

void upd(int i, int v, int l=0, int r=n-1, int pos=1){
    if(l==r){
        segt[pos]=v;
    }
    else{
        long long mid=(l+r)/2;
        if(i<=mid)
            upd(i, v, l, mid, pos*2);
        else
            upd(i, v, mid+1, r, pos*2+1);
        segt[pos]=segt[pos*2]+segt[pos*2+1];
    }
}

long long getsum(int ls, int rs, int l=0, int r=n-1, int pos=1){
    if(r<ls || l>rs)
        return 0;
    if(ls<=l && r<=rs)
        return segt[pos];
    long long mid=(l+r)/2;
    return getsum(ls, rs, l, mid, pos*2)+getsum(ls, rs, mid+1, r, pos*2+1);
}

int main()
{
//    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    long long q; cin>>n>>q>>k;
    set<int> st;
    for(long long i=0; i<n; i++){
        cin>>mas[i];
        if(mas[i])
            st.insert(i);
        upd(i, mas[i]);
    }

    for(long long i=0; i<q; i++){
        long long s; cin>>s;
        if(s==1){
            long long a, b; cin>>a>>b; a--;
            mas[a]=b;
            if(b)
                st.insert(a);
            else if(st.count(a) && mas[a]==0)
                st.erase(a);
            upd(a, b);
        }
        else if(s==2){
            long long l, r; cin>>l>>r; l--, r--;
            if(k==1)
                continue;
            auto it = st.lower_bound(l);
            while(it!=st.end() && *it<=r){
                upd(*it, 0);
                int idx = *it;
                mas[idx]/=k;
                upd(idx, mas[idx]);
                if(mas[idx]==0)
                    st.erase(idx);
                it = st.lower_bound(l);
            }
        }
        else{
            long long l, r; cin>>l>>r; l--, r--;
            cout<<getsum(l, r)<<endl;
        }
//        cout<<"Sis: ";
//        debug();
    }
    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...