제출 #1238928

#제출 시각아이디문제언어결과실행 시간메모리
1238928lambd47Sterilizing Spray (JOI15_sterilizing)C++17
80 / 100
5092 ms7160 KiB
#include <bits/stdc++.h>

#define int long long
using namespace std;

#define sz(v) ((int)(v).size())
#define all(v) (v).begin(), (v).end()
#define L(i, j, k) for(int i = (j); i <= (k); ++i)
#define R(i, j, k) for(int i = (j); i >= (k); --i)

std::mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count());

struct node{
    int nz,val;
    node(){
        nz=0;val=0;
    }
    node(int x){
        nz=1;
        val=x;
    }
    node(int x, int y){
        nz=x;
        val=y;
    }
    node operator+(const node& aux)const {
        return node(nz+aux.nz,val+aux.val);
    }
};
const int MX=1e5+7;
node seg[4*MX];


int k;
void upd1(int pos, int ini, int fim, int id, int val){
    if(ini>id ||fim<id)return;
    if(ini==fim){
        seg[pos].nz=(int)(val!=0);
        seg[pos].val=val;
        return;
    }
    int m=(ini+fim)/2;
    int e=2*pos,d=2*pos+1;
    upd1(e,ini,m,id,val);
    upd1(d,m+1,fim,id,val);
    seg[pos]=seg[e]+seg[d];
    return;
}
void upd2(int pos, int ini, int fim, int l, int r){
    if(seg[pos].nz == 0)return;
    if(ini>r || fim<l) return;
    if(ini==fim){
        seg[pos].val/=k;
        seg[pos].nz=(int)(seg[pos].val!=0);
        return;
    }
    int m=(ini+fim)/2;
    int e=2*pos,d=2*pos+1;
    upd2(e,ini,m,l,r);
    upd2(d,m+1,fim,l,r);
    seg[pos]=seg[e]+seg[d];
    return;
}
int query(int pos, int ini, int fim,int l, int r){
    if(fim<l || ini>r)return 0;
    if(l<= ini && fim <= r){
        return seg[pos].val;
    }
    int m=(ini+fim)/2;
    int e=2*pos,d=2*pos+1;
    return query(e,ini,m,l,r)+query(d,m+1,fim,l,r);
}

void solve() {
    int n,q;cin>>n>>q>>k;
    L(i,0,n-1){
        int x;cin>>x;
        upd1(1,0,n-1,i,x);
    }
    while(q--){
        int tipo;cin>>tipo;
        if(tipo==1){
            int a,b;cin>>a>>b;
            a--;
            upd1(1,0,n-1,a,b);
        }
        else if(tipo==2){
            int l,r;cin>>l>>r;
            l--;r--;
            upd2(1,0,n-1,l,r);
        }
        else{
            int l,r;cin>>l>>r;
            l--;r--;
            cout<<query(1,0,n-1,l,r)<<"\n";
        }
    }



}
 
int32_t main() {
    std::cin.tie(0)->sync_with_stdio(0); 
    std::cin.exceptions(std::cin.failbit);

    int T = 1;
//    std::cin >> T;
    while(T--) {
        solve();
    }

	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...