제출 #204487

#제출 시각아이디문제언어결과실행 시간메모리
204487aloo123Sterilizing Spray (JOI15_sterilizing)C++14
100 / 100
363 ms8184 KiB
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define f first
#define s second
#define mp make_pair
#define pb push_back
#define vll vector<ll>
#define pll pair<ll,ll>
using namespace std;

const ll N = 1e5+5;
const ll MOD = 1e9+7;
ll tree[4LL*N];


ll a[N];
ll k;
ll ma[4LL*N];
ll LOG(ll n){
    ll ans = 0;
    while(n){
        ans += 1;
        n /= k;
    }
    return ans;
}
void merge(ll node){
    tree[node] = tree[node*2] + tree[node*2+1];
    ma[node] = max(ma[node*2],ma[node*2+1]);
}

void build(ll node,ll l,ll r){
    if(l==r){
        tree[node] = a[l];
        ma[node] = a[l];
    }
    else{
        ll mid = (l+r)/2;
        build(node * 2,l,mid);
        build(node * 2 + 1,mid+1,r);
        merge(node);
    }
}

void update(ll node,ll l,ll r,ll idx,ll val){
    if(l == r){
        tree[node] = val;
        ma[node] = val;
    }
    else{
        ll mid = (l+r)/2;
        if(idx <= mid) update(node * 2,l,mid,idx,val);
        else update(node * 2 +1,mid+1,r,idx,val);
        merge(node);
    }
}

void update2(ll node,ll l,ll r,ll st,ll en){
     if(l > en || r < st) return ;
     if(l >= st && r<=en){
        if(ma[node] == 0) return;
         if(l == r){
             
             tree[node] /= k;
             ma[node] /= k;
            return;
         }}
    ll mid = (l+r)/2;
    update2(node*2,l,mid,st,en);
    update2(node*2+1,mid+1,r,st,en);
    merge(node);
}

ll query(ll node,ll l,ll r,ll st,ll en){
    if(l > en || r < st) return 0;
    if(l >= st && r<=en) return tree[node];
    ll mid =(l+r)/2;
    ll p1 = query(node*2,l,mid,st,en);
    ll p2 = query(node*2+1,mid+1,r,st,en);
    return p1 +p2;
}

int main()
{


    ios_base::sync_with_stdio(0);
    cin.tie(0);


    ll n,q;
    cin >> n >> q >> k;


    for(int i = 1;i<=n;i++) cin >> a[i];
    build(1,1,n);
    while(q--){
        ll t,l,r;
        cin>> t>> l >> r;
        if(t == 1){
            update(1,1,n,l,r);
        }
        else if(t==2){
            if(k != 1)
            update2(1,1,n,l,r);
        }
        else{
            cout << query(1,1,n,l,r) << endl;
        }
    }


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