Submission #1249035

#TimeUsernameProblemLanguageResultExecution timeMemory
1249035wedonttalkanymoreAddk (eJOI21_addk)C++20
100 / 100
201 ms27788 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...