Submission #1318185

#TimeUsernameProblemLanguageResultExecution timeMemory
1318185jesusargAddk (eJOI21_addk)C++20
100 / 100
91 ms5832 KiB
#include <bits/stdc++.h>
#define int long long 
using namespace std;
vector<int> tree(2e5+3), treep(2e5+3), vet(1e5+5);
int n;

void build(){
    for(int i = 0; i < n; i++){
        tree[n+i]=vet[i];
        treep[n+i]=vet[i]*(i+1);
    }
    for(int i = n-1; i > 0; i--){
        tree[i]=tree[i<<1]+tree[i<<1|1];
        treep[i]=treep[i<<1]+treep[i<<1|1];
    }
}

void update(int pos, int v){
    vet[pos]=v; 
    int p=pos+n;
    tree[p]=v;
    treep[p]=v*(pos+1);
    for(p >>= 1; p>0; p>>=1){
        tree[p]=tree[p<<1]+tree[p<<1|1];
        treep[p]=treep[p<<1]+treep[p<<1|1];
    }
}

int query1(int l, int r){
    int ans=0;
    l+=n; r+=n;
    while(l<r){
        if(l&1) ans+=tree[l++];
        if(r&1) ans+=tree[--r];
        l>>=1;
        r>>=1;
    }
    return ans;
}

int query2(int l, int r){
    int ans=0;
    l+=n; r+=n;
    while(l<r){
        if(l&1) ans+=treep[l++];
        if(r&1) ans+=treep[--r];
        l>>=1;
        r>>=1;
    }
    return ans;
}

int32_t main(){
    ios_base::sync_with_stdio(0); 
    cin.tie(0); 
    cout.tie(0);
    int k;
    cin >> n >> k;
    for(int i = 0; i < n; i++) 
        cin >> vet[i];
        
    build();
    int q;
    cin >> q;
    while(q--){
        int t;
        cin >> t;
        if(t&1){
            vector<int> idx(k), vals(k);
            for(int i = 0; i < k; i++){
                cin >> idx[i]; 
                idx[i]--; 
                vals[i]=vet[idx[i]];
            }
            for(int i = 0; i < k; i++){
                update(idx[i],vals[(i+1)%k]);
            }
        }else{
            int l, r, m;
            cin >> l >> r >> m;
            int len = r-l+1;
            int h = min(m,len-m+1);
            int p1 = l+h-1;
            int p2 = r-h+1; 
            int ans = 0;
            if(p1<p2){
                ans+=query2(l-1, p1)-(l-1)*query1(l-1, p1);
                ans+=h*query1(p1, p2-1);
                ans+=(r+1)*query1(p2-1, r)-query2(p2-1, r);
            }else{
                int mid=(l+r)/2;
                ans+=query2(l-1, mid)-(l-1)*query1(l-1, mid);
                ans+=(r+1)*query1(mid, r)-query2(mid,r);
            }
            cout << ans << '\n';
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...