This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int NM = 1e6, KM = 10;
int N, K, Q, a[NM+5];
int bit[NM+5], bit2[NM+5];
int idx[KM+5], b[NM+5];
void update(int bit[NM+5], int p, int v){
while (p <= N){
bit[p] += v;
p += p & (-p);
}
}
int get(int bit[NM+5], int p){
int res = 0;
while (p > 0){
res += bit[p];
p -= p & (-p);
}
return res;
}
void modify(){
for (int i = 1; i < K; i++)
b[idx[i]] = a[idx[i+1]];
b[idx[K]] = a[idx[1]];
for (int i = 1; i <= K; i++){
update(bit, idx[i], b[idx[i]]-a[idx[i]]);
update(bit2, idx[i], (b[idx[i]]-a[idx[i]])*idx[i]);
a[idx[i]] = b[idx[i]];
}
}
int get(int l, int r){
return get(bit, r)-get(bit, l-1);
}
int get1(int l, int r){
return get(bit2, r)-get(bit2, l-1)-(l-1)*get(l, r);
}
int get2(int l, int r){
return -get1(l, r)+(r-l+2)*get(l, r);
}
void query(int l, int r, int m){
int t = min(m, r-l-m+2);
cout << get1(l, l+t-2)+get(l+t-1, r-t+1)*t+get2(r-t+2, r) << '\n';
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> N >> K;
for (int i = 1; i <= N; i++){
cin >> a[i];
update(bit, i, a[i]);
update(bit2, i, a[i]*i);
}
cin >> Q;
while (Q--){
int type; cin >> type;
if (type == 1){
for (int i = 1; i <= K; i++) cin >> idx[i];
modify();
}
else{
int l, r, m;
cin >> l >> r >> m;
query(l, r, m);
}
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |