#include <bits/stdc++.h>
#define GOOD_LUCK ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define int long long
#define endl "\n"
#define ff first
#define ss second
#define pb push_back
#define all(v) v.begin(), v.end()
using namespace std;
constexpr int MAX = 2e+5 + 1, INF = 2e+16, MOD = 1e+9 + 7, K = 31;
struct SegTree{
int n;
vector <int> a;
vector <array<int, 4>> t; // [0] - sum [1] - pr sum [2] - sf sum [3] - size
void init(int n1, vector <int> &v) {
n = n1;
a = v;
t.resize(4*(n+2));
}
array <int, 4> merge(array <int, 4> a, array <int, 4> b) {
return {a[0] + b[0], a[1] + b[1] + b[0] * a[3], b[2] + a[2] + a[0] * b[3], a[3] + b[3]}; // TODO
}
void build(int v, int tl, int tr) {
if (tl == tr) {
t[v] = {a[tl], a[tl], a[tl], 1};
return;
}
int tm = (tl + tr) / 2;
build(2*v, tl, tm);
build(2*v+1, tm+1, tr);
t[v] = merge(t[v*2], t[v*2+1]);
}
array<int, 4> find(int v, int tl, int tr, int l, int r) {
if (l > r) {
array <int, 4> x;
x[0] = x[1] = x[2] = x[3] = 0;
return x;
} // TODO
if (tl == l && tr == r) return t[v];
int tm = (tl + tr) / 2;
array <int, 4> r1 = find(v*2, tl, tm, l, min(r, tm));
array <int, 4> r2 = find(v*2+1, tm+1, tr, max(l, tm+1), r);
return merge(r1, r2);
}
void update(int v, int tl, int tr, int i, int x) {
if (tl == tr) {
t[v] = {x, x, x, 1};
a[tl] = x;
return;
}
int tm = (tl + tr) / 2;
if (i <= tm) update(v*2, tl, tm, i, x);
else update(v*2+1, tm+1, tr, i, x);
t[v] = merge(t[v*2], t[v*2+1]);
}
array <int, 4> get(int l, int r) {
return find(1, 0, n-1, l, r);
}
void upd(int i, int x) {
update(1, 0, n-1, i, x);
}
};
void _() {
int n, k;
cin >> n >> k;
vector <int> v(n);
for (int &i : v) cin >> i;
SegTree t;
t.init(n, v);
t.build(1, 0, n-1);
int q;
cin >> q;
while (q--) {
int d;
cin >> d;
if (d == 1) {
vector <int> id(k);
for (int &i : id) cin >> i, i--;
vector <int> x(k);
for (int i=0; i < k; i++) {
x[i] = v[id[(i + 1) % k]];
}
for (int i=0; i < k; i++) {
t.upd(id[i], x[i]);
}
for (int i = k-1; i > 0; i--) {
swap(v[id[i]], v[id[0]]);
}
}
else {
int l, r, m;
cin >> l >> r >> m;
--l, --r;
if (m == 1) {
cout << t.get(l, r)[0] << endl;
continue;
}
if (2 * (m - 1) > r - l + 1) m = r - l + 2 - m;
if (2 * (m - 1) <= r - l + 1) {
int res = t.get(l, l + m - 2)[1] + t.get(r - m + 2, r)[2];
// cout << l << ' ' <<l + m - 2 << ' ' << t.get(l, l + m - 2)[1] << endl;
if (l + m - 1 <= r - m + 1) {
res += t.get(l + m - 1, r - m + 1)[0] * m;
// cout << "x" << ' ';
}
cout << res << endl;
continue;
}
else cout << "I think this is impossible!!!";
}
}
}
signed main() {
GOOD_LUCK
int tests=1;
// cin >> tests;
for (int i=1; i <= tests; i++) {
_();
// cout << endl;
}
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... |