Submission #1262648

#TimeUsernameProblemLanguageResultExecution timeMemory
1262648iordache_Addk (eJOI21_addk)C++20
100 / 100
98 ms4936 KiB
#include <bits/stdc++.h>
#define pb push_back
#define int long long
using namespace std;
const int N=1e5+5;
struct AIB
{
    int n;
    vector<int> aib;
    void init(int _n) {n=_n;aib.resize(n+5);}
    void update(int i, int x)
    {
        while(i<=n)
        {
            aib[i]+=x;
            i+=i&(-i);
        }
    }
    int pref(int i)
    {
        if(i<1) return 0;
        if(i>n) i=n;
        int ans=0;
        while(i)
        {
            ans+=aib[i];
            i-=i&(-i);
        }
        return ans;
    }
    int query(int l, int r) {return pref(r)-pref(l-1);}
};
int v[N];
AIB sp,pref,suf;
signed main()
{
    ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int n,k;
    cin>>n>>k;
    for(int i=1;i<=n;++i) cin>>v[i];
    sp.init(n);pref.init(n);suf.init(n);
    for(int i=1;i<=n;++i)
    {
        sp.update(i,v[i]);
        pref.update(i,v[i]*i);
        suf.update(i,v[i]*(n-i+1));
    }
    int q;cin>>q;
    while(q--)
    {
        int op;cin>>op;
        if(op==1)
        {
            vector<int> poz;
            for(int _=1;_<=k;++_) {int x;cin>>x;poz.pb(x);}
            for(auto x:poz)
            {
                sp.update(x,-v[x]);
                pref.update(x,-v[x]*x);
                suf.update(x,-v[x]*(n-x+1));
            }
            int cpy=v[poz[0]];
            for(int i=0;i+1<poz.size();++i)
            {
                v[poz[i]]=v[poz[i+1]];
            }
            v[poz.back()]=cpy;
            for(auto x:poz)
            {
                sp.update(x,v[x]);
                pref.update(x,v[x]*x);
                suf.update(x,v[x]*(n-x+1));
            }
        }
        else
        {
            int l,r,m;cin>>l>>r>>m;
            int sz=r-l+1;
            int mx=min(sz-m+1,m);
            //for(int i=l;i<=l+mx-2;++i) cout<<i-l+1<<" ";
            //for(int i=l+mx-1;i<=r-mx+1;++i) cout<<mx<<" ";
            //for(int i=r-mx+2;i<=r;++i) cout<<r-i+1<<" ";
            //cout<<"  ";
            int ans=pref.query(l,l+mx-2)-sp.query(l,l+mx-2)*(l-1);
            //cout<<ans<<"! ";
            ans+=sp.query(l+mx-1,r-mx+1)*mx;
            //cout<<ans<<"!! ";
            ans+=suf.query(r-mx+2,r)-sp.query(r-mx+2,r)*(n-r);
            cout<<ans<<'\n';
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...