#include <bits/stdc++.h>
#define task "BriantheCrab"
#define int long long
#define pii pair <int, int>
#define fi first
#define se second
#define szf sizeof
#define sz(s) (int)((s).size())
#define all(v) (v).begin(), (v).end()
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
using namespace std;
template <class T> void minimize (T &t, T f) {if (t > f) t = f;}
template <class T> void maximize (T &t, T f) {if (t < f) t = f;}
const int maxN = 2e5 + 5;
const int inf = 1e18 + 7;
const int mod = 1e9 + 7;
int n, k;
int a[maxN];
struct Node {
int L, Mid, R;
};
struct ST {
vector <Node> st;
void init (int n) {
st.resize (n * 4, {0, 0, 0});
}
Node merge (Node A, Node B) {
Node c;
c.L = A.L + B.L;
c.Mid = A.Mid + B.Mid;
c.R = A.R + B.R;
return c;
}
void upd (int id, int l, int r, int pos, int val) {
if (pos < l || pos > r) {
return;
}
if (l == r) {
st[id] = {val * pos, val, val * (n - pos + 1)};
return;
}
int mid = (l + r) >> 1;
upd (id * 2, l, mid, pos, val);
upd (id * 2 + 1, mid + 1, r, pos, val);
st[id] = merge (st[id * 2], st[id * 2 + 1]);
}
Node get (int id, int l, int r, int u, int v) {
if (v < l || u > r || u > v) {
return {0, 0, 0};
}
if (u <= l && r <= v) {
return st[id];
}
int mid = (l + r) >> 1;
auto tL = get (id * 2, l, mid, u, v);
auto tR = get (id * 2 + 1, mid + 1, r, u, v);
return merge (tL, tR);
}
};
ST T;
void solve () {
cin >> n >> k;
T.init (n);
for (int i = 1; i <= n; i ++) {
cin >> a[i];
T.upd (1, 1, n, i, a[i]);
}
int q;
cin >> q;
while (q --) {
int type;
cin >> type;
if (type == 1) {
int m = k;
vector <int> tmp;
tmp.push_back (0);
for (int i = 1; i <= m; i ++) {
int id;
cin >> id;
tmp.push_back (id);
}
int c = a[tmp[1]];
for (int i = 1; i < m; i ++) {
int new_val = a[tmp[i + 1]];
T.upd (1, 1, n, tmp[i], new_val);
a[tmp[i]] = new_val;
}
T.upd (1, 1, n, tmp[m], c);
a[tmp[m]] = c;
}
else {
int l, r, m;
cin >> l >> r >> m;
if (m > r - l + 1) {
cout << 0 << "\n";
continue;
}
int res = 0;
if (l + 2 * m - 1 <= r) {
int b1 = l + m - 1;
int b2 = r - m + 1;
Node res1 = T.get (1, 1, n, l, b1);
res += res1.L - res1.Mid * (l - 1);
Node res2 = T.get (1, 1, n, b1 + 1, b2);
res += res2.Mid * m;
Node res3 = T.get (1, 1, n, b2 + 1, r);
res += res3.R - res3.Mid * (n - r);
}
else if (l + 2 * m - 2 == r) {
int p = l + m - 1;
Node res1 = T.get(1, 1, n, l, p);
res += res1.L - res1.Mid * (l - 1);
Node res2 = T.get(1, 1, n, p + 1, r);
res += res2.R - res2.Mid * (n - r);
}
else {
int p1 = r - m + 1;
int p2 = l + m - 1;
Node res1 = T.get (1, 1, n, l, p1);
res += res1.L - res1.Mid * (l - 1);
Node res2 = T.get (1, 1, n, p1 + 1, p2 - 1);
res += res2.Mid * (r - l - m + 2);
Node res3 = T.get (1, 1, n, p2, r);
res += res3.R - res3.Mid * (n - r);
}
cout << res << '\n';
}
}
}
signed main () {
cin.tie (nullptr) -> sync_with_stdio (false);
if (fopen (task".inp", "r")) {
freopen (task".inp", "r", stdin);
freopen (task".out", "w", stdout);
}
int t = 1;
//cin >> t;
while (t --) {
solve ();
}
return 0;
}
// thfv
Compilation message (stderr)
Main.cpp: In function 'int main()':
Main.cpp:151:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
151 | freopen (task".inp", "r", stdin);
| ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:152:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
152 | freopen (task".out", "w", stdout);
| ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |