Submission #1326192

#TimeUsernameProblemLanguageResultExecution timeMemory
1326192harySterilizing Spray (JOI15_sterilizing)C++20
100 / 100
364 ms10308 KiB
#include <bits/stdc++.h>

using namespace std;
vector<long long> c,rez;
set<long long> st;
long long n=0,q=0,k=0,x=0,s=0,t=0,u=0;
struct segmentree{
    vector<long long> tree;
    void init(){
        tree.assign(400001,0);
    }
    void build(long long x, long long l, long long r){
        if(r-l==0){
            tree[x]=c[l];
            return;
        }
        long long m=(l+r)/2;
        build(x*2+1,l,m);
        build(x*2+2,m+1,r);

        tree[x]=tree[2*x+1]+tree[2*x+2];
    }

    void update(long long x, long long l, long long r, long long i, long long v){
        if(r-l==0){
            tree[x]=v;
            //cout<<'!'<<tree[x]<<'\n';
            return;
        }
        long long m=(l+r)/2;
        if(i<=m) update(x*2+1,l,m,i,v);
        else update(x*2+2,m+1,r,i,v);

        tree[x]=tree[2*x+1]+tree[2*x+2];

    }

    long long sum(long long x, long long lx, long long rx, long long l, long long r){
        if(lx>r||rx<l)return 0;
        else if(lx>=l&&rx<=r){
                //cout<<tree[x]<<' ';
            return tree[x];
        }
        else{
            long long mx=(lx+rx)/2;
            long long lsum=sum(2*x+1,lx,mx,l,r);
            long long rsum=sum(2*x+2,mx+1,rx,l,r);

            return lsum+rsum;
        }
    }
};


int main()
{
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);


segmentree segtree;
cin>>n>>q>>k;
for(long long i=0;i<n;i++){
    cin>>x;
    c.push_back(x);
    if(x>0)st.insert(i);
}
segtree.init();
segtree.build(0,0,n-1);
for(long long i=0;i<q;i++){
    cin>>s>>t>>u;
    if(s==1){//now t and u == a and b
        t--;
        c[t]=u;
        if(u==0&&st.count(t)){
            st.erase(t);
        }else st.insert(t);
        segtree.update(0,0,n-1,t,u);
    }else if(s==2){
        if(k>1){
            auto lp=st.lower_bound(t-1);
            while(lp!=st.end()&&*lp<=u-1){
                long long pos=*lp;
                c[pos]/=k;
                segtree.update(0,0,n-1,pos,c[pos]);
                auto it=next(lp,1);
                if(c[pos]==0)st.erase(lp);
                lp=it;
            }
            //segtree.build(0,0,n);
        }

    }else{
        //cout<<'#';
        rez.push_back(segtree.sum(0,0,n-1,t-1,u-1));
        //cout<<'#' ;
    }
    //for(long long y:c){cout<<y<<' ';}
    //cout<<'\n';
}
for(long long y:rez){
    cout<<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...