Submission #1128366

#TimeUsernameProblemLanguageResultExecution timeMemory
112836612345678Addk (eJOI21_addk)C++20
64 / 100
327 ms8820 KiB
#include <bits/stdc++.h>

using namespace std;

const int nx=1e5+5;

#define ll long long

ll n, q, k, a[nx], t, l, r, m, upd[nx];

struct segtree
{
    ll d[4*nx];
    void update(int l, int r, int i, int idx, ll vl)
    {
        if (idx<l||r<idx) return;
        if (l==r) return d[i]=vl, void();
        int md=(l+r)/2;
        update(l, md, 2*i, idx, vl);
        update(md+1, r, 2*i+1, idx, vl);
        d[i]=d[2*i]+d[2*i+1];
    }
    ll query(int l, int r, int i, int ql, int qr)
    {
        if (qr<l||r<ql||r<l) return 0;
        if (ql<=l&&r<=qr) return d[i];
        int md=(l+r)/2;
        return query(l, md, 2*i, ql, qr)+query(md+1, r, 2*i+1, ql, qr);
    }
} up, dn, sm;

int main()
{
    cin.tie(NULL)->sync_with_stdio(false);
    cin>>n>>k;
    for (int i=1; i<=n; i++) cin>>a[i], up.update(1, n, 1, i, i*a[i]), dn.update(1, n, 1, i, (n-i+1)*a[i]), sm.update(1, n ,1, i, a[i]);
    //for (int i=1; i<=n; i++) cout<<"debug "<<i<<' '<<sm.query(1, n, 1, i, i)<<' '<<up.query(1, n,1 , i, i)<<'\n';
    cin>>q;
    while (q--)
    {
        cin>>t;
        if (t==1)
        {
            for (int i=1; i<=k; i++) cin>>upd[i];
            int tmp=a[upd[1]];
            for (int i=1; i<k; i++) a[upd[i]]=a[upd[i+1]];
            a[upd[k]]=tmp;
            for (int i=1; i<=k; i++) up.update(1, n, 1, upd[i], upd[i]*a[upd[i]]), dn.update(1, n, 1, upd[i], (n-upd[i]+1)*a[upd[i]]), sm.update(1, n ,1, upd[i], a[upd[i]]);
            //for (int i=1; i<=n; i++) cout<<"debug "<<i<<' '<<sm.query(1, n, 1, i, i)<<' '<<up.query(1, n,1 , i, i)<<'\n';
        }
        else
        {
            cin>>l>>r>>m;
            int mx=min(m, (r-l+1)-m+1);
            ll lft=up.query(1, n, 1, l, l+mx-1)-sm.query(1, n, 1, l, l+mx-1)*(l-1);
            ll md=mx*sm.query(1, n, 1, l+mx, r-mx);
            ll rgt=dn.query(1, n, 1, r-mx+1, r)-sm.query(1, n, 1, r-mx+1, r)*(n-r);
            //cout<<mx<<' '<<lft<<' '<<md<<' '<<rgt<<'\n';
            cout<<lft+md+rgt<<'\n';
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...