#include <bits/stdc++.h>
using namespace std;
#define int long long
struct segment_tree{
vector<int> seg;
int N;
void init(int n){
N = n;
seg.resize(n * 4, 0);
}
void upd(int node, int start, int end, int idx, int val){
if(start == end){
seg[node] = val;
return;
}
int mid = start + (end - start) / 2;
if(idx <= mid) upd(node * 2 + 1, start, mid, idx, val);
else upd(node * 2 + 2, mid + 1, end, idx, val);
seg[node] = seg[node * 2 + 1] + seg[node * 2 + 2];
}
int query(int node, int start, int end, int l, int r){
if(start > r || end < l) return 0;
if(start >= l && end <= r) return seg[node];
int mid = start + (end - start) / 2;
return query(node * 2 + 1, start, mid, l, r)
+ query(node * 2 + 2, mid + 1, end, l, r);
}
void upd(int point, int val){
upd(0, 1, N, point, val);
}
int query(int l, int r){
if(l > r) return 0;
return query(0, 1, N, l, r);
}
} tr1, tr2, tr3;
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(nullptr); cout.tie(nullptr);
int n, k, q, t, l, r, m;
cin >> n >> k;
vector<int> a(n + 1, 0);
for(int i = 1; i <= n; ++i){
cin >> a[i];
}
tr1.init(n + 5), tr2.init(n + 5), tr3.init(n + 5);
for(int i = 1; i <= n; ++i){
tr1.upd(i, a[i] * i);
tr2.upd(i, a[i] * (n - i + 1));
tr3.upd(i, a[i]);
}
auto get = [&](int l, int r, int xx) -> int{
if(l > r) return -1;
return tr3.query(l, r) * xx;
};
cin >> q;
while(q--){
cin >> t;
if(t == 1){
vector<int> pos(k);
for(auto &it : pos) cin >> it;
int tmp = a[pos[0]];
for(int i = 0; i < (int) pos.size() - 1; ++i){
a[pos[i]] = a[pos[i + 1]];
tr1.upd(pos[i], a[pos[i + 1]] * pos[i]);
tr2.upd(pos[i], a[pos[i + 1]] * (n - pos[i] + 1));
tr3.upd(pos[i], a[pos[i + 1]]);
}
a[pos.back()] = tmp;
tr1.upd(pos.back(), tmp * pos.back());
tr2.upd(pos.back(), tmp * (n - pos.back() + 1));
tr3.upd(pos.back(), tmp);
}else{
cin >> l >> r >> m;
int ans = 0;
if((r - l + 1) == m){
ans = tr3.query(l, r);
}else{
int xyz = min(r - l - m + 2, m);
ans += tr1.query(l, l + xyz - 2) - tr3.query(l, l + xyz - 2) * (l - 1);
ans += tr2.query(r - xyz + 2, r) - tr3.query(r - xyz + 2, r) * (n - r);
ans += tr3.query(l + xyz - 1, r - xyz + 1) * xyz;
}
cout << ans << "\n";
}
}
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... |