Submission #1176667

#TimeUsernameProblemLanguageResultExecution timeMemory
1176667syanvuAddk (eJOI21_addk)C++20
100 / 100
1704 ms4792 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 all(x) x.begin(),x.end()
#define F first
#define S second

using namespace std;
using namespace __gnu_pbds;

#define ordered_set tree<pair<int,int>, null_type,less_equal<pair<int,int>>, rb_tree_tag,tree_order_statistics_node_update>

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

int t[4*N];

void upd(int v,int tl,int tr,int pos,int x){
    if(tl==tr){
        t[v]=x;
        return;
    }
    int mid=(tl+tr)/2;
    if(mid>=pos){
        upd(v*2,tl,mid,pos,x);
    }
    else{
        upd(v*2+1,mid+1,tr,pos,x);
    }
    t[v]=t[v*2]+t[v*2+1];
}
int get(int v,int tl,int tr,int l,int r){
    if(tl>r || l>tr) return 0;
    if(tl>=l && tr<=r) return t[v];
    int mid=(tl+tr)/2;
    return get(v*2,tl,mid,l,r)+get(v*2+1,mid+1,tr,l,r);
}

void solve()
{
    int n,k;
    cin>>n>>k;
    int a[n+1];
    for(int i=1;i<=n;i++){
        cin>>a[i];
        upd(1,1,n,i,a[i]);
    }
    int q;
    cin>>q;
    while(q--){
        int t;
        cin>>t;
        if(t==1){
            vector<int> v,d;
            for(int i=1;i<=k;i++){
                int x;
                cin>>x;
                v.push_back(x);
                d.push_back(a[x]);
            }
            for(int i=0;i<k;i++){
                if(i==k-1){
                    a[v[i]]=d[0];
                }
                else{
                    a[v[i]]=a[v[i+1]];
                }
                upd(1,1,n,v[i],a[v[i]]);
            }
            
        }
        else{
            int l,r,m;
            cin>>l>>r>>m;
            int sum=get(1,1,n,l,r)*m;
            for(int i=l,j=m-1;j>0;i++,j--){
                sum-=a[i]*j;
            }
            for(int i=r,j=m-1;j>0;i--,j--){
                sum-=a[i]*j;
            }
            cout<<sum<<'\n';
        }
    }
}

signed main()
{   
  SS
  int t=1;
  if(T){
    cin>>t;
  }
  while(t--){
    solve();
  }
}
//5 1 4 2
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...