Submission #1324895

#TimeUsernameProblemLanguageResultExecution timeMemory
1324895dianaSterilizing Spray (JOI15_sterilizing)C++20
10 / 100
47 ms4796 KiB
#include <bits/stdc++.h>
#define ll long long
using namespace std;

const int N = 1e5+5;
ll c[N];
int n, q, k, d;


class ST
{
private:
    vector<ll> sum;
//    vector<vector<ll>> sum;
public:
    ST(int nn)
    {
        sum.assign(4*N, 0);
    }
    ll add(int i, int x, int l=1, int r=n, int cur=1)
    {
        if(i<l || r<i) return sum[cur];
        if(l==r)
            return sum[cur] = x;
        int m=((l+r)>>1), r1=(cur<<1), r2=((cur<<1)|1);
        if(sum[cur] == 0) sum[r1] = sum[r2] = 0;
        return sum[cur] = add(i,x,l,m,r1) + add(i,x,m+1,r,r2);

//        if(i < l || r < i)  return;
//        if(l == r)
//        {
//            sum[cur][0] = x;
//            for(int i=1; i<d; i++) sum[cur][i] = sum[cur][i-1]/k;
//            return;
//        }
//        add(i, x, l, m, r1);
//        add(i, x, m+1, r, r2);
//        for(int i=0; i<d; i++)
//            sum[cur][i] = sum[r1][i] + sum[r2][i];
    }
    ll get_sum(int lg, int rg, int l=1, int r=n, int cur=1)
    {
        if(r<lg || rg<l || sum[cur]==0) return 0;
        if(lg<=l && r<=rg) return sum[cur];
        int m=((l+r)>>1), r1=(cur<<1), r2=((cur<<1)|1);
        if(sum[cur] == 0) sum[r1] = sum[r2] = 0;
        return get_sum(lg,rg,l,m,r1)+get_sum(lg,rg,m+1,r,r2);
    }
    ll ch(int lg, int rg, int l=1, int r=n, int cur=1)
    {
        if(r<lg || rg<l) return 0;
        if(lg<=l && r<=rg) return sum[cur]=0;
        int m=((l+r)>>1), r1=(cur<<1), r2=((cur<<1)|1);
        if(sum[cur] == 0) sum[r1] = sum[r2] = 0;
        ch(lg,rg,l,m,r1);
        ch(lg,rg,m+1,r,r2);
        return 0;
    }
};

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

    cin >> n >> q >> k;
    ST sk(n);
    for(int i=1; i<=n; i++)
    {
        cin >> c[i];
        sk.add(i,c[i]);
    }

    while(q--)
    {
        int s, t, u; cin >> s >> t >> u;
        if(s==1) sk.add(t, u);
        if(s==2 && k!=1) sk.ch(t,u);
        if(s==3) cout << sk.get_sum(t, u) << '\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...