Submission #1324978

#TimeUsernameProblemLanguageResultExecution timeMemory
1324978andy_vokizSterilizing Spray (JOI15_sterilizing)C++20
10 / 100
46 ms4904 KiB

#include <bits/stdc++.h>
#define fio ios_base::sync_with_stdio(0); cin.tie(0);

using namespace std;
vector<long long> segt;
void build(int i, int l, int r, vector<long long>& v){
    if(l == r){
        segt[i] = v[l];
    }else{
        int mid = (l+r)/2;
        build(i*2, l ,mid, v);
        build(i*2+1, mid+1, r, v);
        segt[i] = segt[i*2]+segt[i*2+1];
    }
}
void seti(int i, int l, int r, int pos, int val){
    if(l == r){
        segt[i] = val;
    }else{
        int mid = (l+r)/2;
        if(pos <= mid){
            seti(i*2, l, mid, pos, val);
        }else{
            seti(i*2+1, mid+1, r, pos, val);
        }
        segt[i] = segt[i*2] + segt[i*2+1];
    }
}
long long sumi(int i, int l, int r, int lb, int rb){
    if(r < lb || l > rb){
        return 0;
    }else if(l >= lb && r <= rb){
        return segt[i];
    }else{
        int mid = (l+r)/2;
        return sumi(i*2, l, mid, lb, rb) + sumi(i*2+1, mid+1, r, lb, rb);
    }
}
int main()
{
    fio
    int n, q, k;
    cin >> n >> q >> k;
    vector<long long> v(n);
    for(int i = 0; i < n; ++i){
        cin >> v[i];
    }
    segt.resize(4*n, 0);
    build(1, 0, n-1, v);
    if(k == 1){
        for(int i = 0; i < q; ++i){
            int op;
            cin >> op;
            if(op == 1){
                int a, b;
                cin >> a >> b;
                --a;
                seti(1, 0, n-1, a, b);
            }else if(op == 2){
                int l, r;
                cin >> l >> r;
            }else if(op == 3){
                int l, r;
                cin >> l >> r;
                --l;
                --r;
                cout << sumi(1, 0, n-1, l, r) << '\n';
            }
        }
    }else{
        set<int> s;
        for(int i = 0; i < n; ++i){
            if(v[i] > 0){
                s.insert(i);
            }
        }
        for(int i = 0; i < q; ++i){
            int op;
            cin >> op;
            if(op == 1){
                int a, b;
                cin >> a >> b;
                --a;
                s.erase(a);
                v[a] = b;
                if(b > 0){
                    s.insert(a);
                }
                seti(1, 0, n-1, a, b);
            }else if(op == 2){
                int l, r;
                cin >> l >> r;
                --l;
                --r;
                auto it = s.lower_bound(l);
                while(it != s.end() && *it <= r){
                    seti(1, 0, n-1, *it, v[*it]/k);
                    v[*it] = v[*it]/k;
                    if(v[*it] == 0){
                        s.erase(it);
                    }
                    //l = (*it)+1;
                    //if(l > r){
                    //    break;
                    //}
                    //it = s.lower_bound(l);
                    ++it;
                }
            }else if(op == 3){
                int l, r;
                cin >> l >> r;
                --l;
                --r;
                cout << sumi(1, 0, n-1, l, r) << '\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...