#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 time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |