Submission #1298209

#TimeUsernameProblemLanguageResultExecution timeMemory
1298209dang_hai_longAddk (eJOI21_addk)C++20
100 / 100
73 ms4560 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

struct Fenwick {
    int n;
    vector<ll> bit;
    Fenwick(int n=0){ init(n); }
    void init(int n_){
        n = n_;
        bit.assign(n+1, 0);
    }
    void add(int idx, ll delta){
        for(; idx <= n; idx += idx & -idx) bit[idx] += delta;
    }
    ll sumPrefix(int idx){
        ll res = 0;
        for(; idx > 0; idx -= idx & -idx) res += bit[idx];
        return res;
    }
    ll rangeSum(int l, int r){
        if(l>r) return 0;
        return sumPrefix(r) - sumPrefix(l-1);
    }
};

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int N, K;
    if(!(cin >> N >> K)) return 0;
    vector<ll> A(N+1);
    for(int i=1;i<=N;i++) cin >> A[i];

    Fenwick bitA(N), bitJA(N);
    for(int i=1;i<=N;i++){
        bitA.add(i, A[i]);
        bitJA.add(i, A[i] * (ll)i);
    }

    int Q; cin >> Q;
    while(Q--){
        int type; cin >> type;
        if(type == 1){
            vector<int> idx(K);
            for(int i=0;i<K;i++) cin >> idx[i];
            vector<ll> old(K);
            for(int i=0;i<K;i++) old[i] = A[idx[i]];
            for(int i=0;i<K;i++){
                ll newv = old[(i+1)%K];
                int pos = idx[i];
                if(newv != A[pos]){
                    ll delta = newv - A[pos];
                    bitA.add(pos, delta);
                    bitJA.add(pos, delta * (ll)pos);
                    A[pos] = newv;
                }
            }
        } else if(type == 2){
            int L, R, m; cin >> L >> R >> m;
            int Send = R - m + 1;
            if(Send < L){
                cout << 0 << '\n';
                continue;
            }
            int p = Send;
            int q = min(R, L + m - 1);

            ll part1 = 0;
            if(L <= p){
                part1 = bitJA.rangeSum(L, p);
            }
            ll part2 = 0;
            if(p+1 <= R){
                ll sA = bitA.rangeSum(p+1, R);
                part2 = sA * (ll)Send;
            }
            ll Sum1 = part1 + part2;

            ll part3 = 0;
            if(L <= q){
                ll sA = bitA.rangeSum(L, q);
                part3 = sA * (ll)L;
            }
            ll part4 = 0;
            if(q+1 <= R){
                ll sum_jA = bitJA.rangeSum(q+1, R);
                ll sumA = bitA.rangeSum(q+1, R);
                part4 = sum_jA - (ll)(m-1) * sumA;
            }
            ll Sum2 = part3 + part4;

            ll totalA = bitA.rangeSum(L, R);
            ll answer = Sum1 - Sum2 + totalA;
            cout << answer << '\n';
        } else {
            
        }
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...