#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define int long long
#define pii pair<ll, ll>
#define fi first
#define se second
const ll N = 2e5 + 5;
int n, k, q, a[N];
struct ST
{
vector<pii> st;
ST(int _n)
{
st.assign(4 * (_n + 1), {0, 0});
}
void update(int i, int l, int r, int p, pii v)
{
if (l == r)
{
st[i] = v;
return;
}
int m = (l + r) >> 1;
if (p <= m) update(2 * i, l, m, p, v);
else update(2 * i + 1, m + 1, r, p, v);
st[i].fi = st[2 * i].fi + st[2 * i + 1].fi;
st[i].se = st[2 * i].se + st[2 * i + 1].se;
}
pii get(int i, int l, int r, int u, int v)
{
if (u > r || v < l) return {0, 0};
if (u <= l && r <= v) return st[i];
int m = (l + r) >> 1;
pii L = get(2 * i, l, m, u, v);
pii R = get(2 * i + 1, m + 1, r, u, v);
return {L.fi + R.fi, L.se + R.se};
}
};
ST st1(N + 1);
ST st2(N + 1);
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> k;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
st1.update(1, 1, n, i, {a[i] * i, a[i] * (n - i + 1)});
st2.update(1, 1, n, i, {a[i], 0});
}
cin >> q;
while (q--)
{
int type;
cin >> type;
if (type == 1)
{
vector<int> pos(k + 1), val(k);
for (int i = 1; i <= k; i++) cin >> pos[i];
for (int i = 2; i <= k; i++) val[i - 2] = a[pos[i]];
val[k - 1] = a[pos[1]];
for (int i = 0; i < k; i++)
{
int p = pos[i + 1], nv = val[i];
st1.update(1, 1, n, p, {nv * p, nv * (n - p + 1)});
st2.update(1, 1, n, p, {nv, 0});
a[p] = nv;
}
}
else
{
int l, r, m;
cin >> l >> r >> m;
int ans = 0;
if (l <= r) ans += st2.get(1, 1, n, l, r).fi * m;
int b1 = l, e1 = l + m - 1;
if (b1 <= e1) ans += st1.get(1, 1, n, b1, e1).fi - st2.get(1, 1, n, b1, e1).fi * e1;
int b2 = r - m + 1, e2 = r;
if (b2 <= e2) ans += st2.get(1, 1, n, b2, e2).fi * b2 - st1.get(1, 1, n, b2, e2).fi;
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... |