Submission #1280662

#TimeUsernameProblemLanguageResultExecution timeMemory
1280662syanvuAddk (eJOI21_addk)C++20
100 / 100
158 ms7528 KiB
#include <bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp> 
// #include <ext/pb_ds/tree_policy.hpp>

#define SS ios_base::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr);
// #pragma optimize("g", on)
// #pragma GCC optimize("03")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,avx2,mmx,fma,avx,tune=native")
#define int long long
// #define ull unsigned long long
#define all(x) x.begin(),x.end()
#define F first
#define S second


using namespace std;
// using namespace __gnu_pbds; 
// #define ordered_set tree<int,null_type,less_equal<int>,rb_tree_tag,tree_order_statistics_node_update>

const int LG = 17,N = 1e6 + 1,inf = 1e18 + 1, MOD = 1e9 + 7;
const double eps = 1e-9;
int T;

int f[N];

int n,k;

void upd(int i,int x){
    while(i<=n){
        f[i] += x;
        i+=i&-i;
    }
}
int get(int i){
    int res=0;
    while(i){
        res+=f[i];
        i-=i&-i;
    }
    return res;
}

int pr[4*N],suf[4*N];

void tupd(int v,int tl,int tr,int pos,int x){
    if(tl==tr){
        pr[v] = x * pos;
        suf[v] = x * (n-pos+1);
        return;
    }
    int mid = (tl+tr)/2;
    if(mid>=pos) tupd(v*2,tl,mid,pos,x);
    else tupd(v*2+1,mid+1,tr,pos,x);
    pr[v] = pr[v*2] + pr[v*2+1];
    suf[v] = suf[v*2] + suf[v*2+1];   
}
int getp(int v,int tl,int tr,int l,int r){
    if(tl>r || l>tr) return 0;
    if(tl>=l && r>=tr) return pr[v];
    int mid=(tl+tr)/2;
    return getp(v*2,tl,mid,l,r)+getp(v*2+1,mid+1,tr,l,r);
}
int gets(int v,int tl,int tr,int l,int r){
    if(tl>r || l>tr) return 0;
    if(tl>=l && r>=tr) return suf[v];
    int mid=(tl+tr)/2;
    return gets(v*2,tl,mid,l,r)+gets(v*2+1,mid+1,tr,l,r);
}

void solve() {
    cin>>n>>k;
    int a[n+1];
    for(int i=1;i<=n;i++){
        cin>>a[i];
        upd(i,a[i]);
        tupd(1,1,n,i,a[i]);
    }
    int q;
    cin>>q;
    while(q--){
        int t;
        cin>>t;
        if(t==1){
            vector<int> v;
            for(int i=0;i<k;i++){
                int x;
                cin>>x;
                v.push_back(x);
            }
            int f = a[v[0]];
            for(int i=0;i<k-1;i++){
                upd(v[i], a[v[i+1]] - a[v[i]]);
                tupd(1,1,n,v[i],a[v[i+1]]);
                a[v[i]] = a[v[i+1]];
            }
            upd(v.back(), f - a[v.back()]);
            tupd(1,1,n,v.back(),f);
            a[v.back()] = f;
        }
        else{
            int l,r,m;
            cin>>l>>r>>m;
            int ans = (get(r) - get(l-1)) * m;
            if(m == 1){
                cout << ans << '\n';
                continue;
            }
            int basesuf = getp(1,1,n,r-m+2,r) - (get(r) - get(r-m+1)) * (r-m+1);
            int basepref = gets(1,1,n,l,l+m-2) - (get(l + m - 2) - get(l-1)) * (n - (l + m - 2));
            cout << ans - basesuf - basepref << '\n';
        }
    }
}
/*
1 2 3 4 5
5 4 3 2 1
*/
signed main() {
    SS
    int t = 1;
    if(T) cin >> t;
    while (t--) {
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...