Submission #1201769

#TimeUsernameProblemLanguageResultExecution timeMemory
1201769asli_bgAddk (eJOI21_addk)C++20
100 / 100
287 ms10844 KiB
#include <bits/stdc++.h>
using namespace std;
 
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;

#define int long long
 
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<pii> vii;
typedef vector<bool> vb;
typedef long long ll;
typedef pair<ll,ll> pll;
typedef vector<pll> vll;
 
typedef tree<pii,null_type,less<pii>,rb_tree_tag,
tree_order_statistics_node_update> oset;
 
#define fi first
#define se second
#define pb push_back
#define pf push_front
 
#define mid (l+r)/2
#define all(x) x.begin(),x.end()
#define FOR(i,a) for(int i=0;i<(a);i++)
#define FORE(i,a,b) for(int i=(a);i<(b);i++)
 
#define cont(x) for(auto el:x) cout<<el<<' ';cout<<endl;
#define contp(x) for(auto el:x) cout<<el.fi<<'-'<<el.se<<' ';cout<<endl;
#define sp <<" "<<
 
#define DEBUG(x) cout<<(#x) sp x<<endl
#define carp(a,b) (((a%MOD)*(b%MOD))%MOD)
#define topla(a,b) (((a%MOD)+(b%MOD))%MOD)
 
const ll INF=1e18;
const int MAXN=1e5+5;
const int MOD=1e9+7;

int n,k;
vi a;

pii t[4*MAXN];
pii t2[4*MAXN];
//t[nd]-->{istenen toplam,normal toplam}

void calc(int nd,int l,int r){
    //cout<<"segt" sp nd sp t[nd*2].fi sp t[nd*2].se sp t[nd*2+1].fi sp t[nd*2+1].se<<endl;
    t[nd].fi=(r-(mid+1)+1)*t[nd*2].se+t[nd*2].fi+t[nd*2+1].fi;
    t[nd].se=t[nd*2].se+t[nd*2+1].se;
    t2[nd].fi=(mid-l+1)*t2[nd*2+1].se+t2[nd*2].fi+t2[nd*2+1].fi;
    t2[nd].se=t2[nd*2].se+t2[nd*2+1].se;
}

void build(int nd=1,int l=1,int r=n){
    if(l==r){
        t[nd].fi=t[nd].se=t2[nd].fi=t2[nd].se=a[l];
        return;
    }

    build(nd*2,l,mid);
    build(nd*2+1,mid+1,r);

    calc(nd,l,r);
}

int q1(int ql,int qr,int nd=1,int l=1,int r=n){
    if(l>r or l>qr or r<ql) return 0;
    if(ql<=l and r<=qr){
        return t[nd].se;
    }
    auto s1=q1(ql,qr,nd*2,l,mid);
    auto s2=q1(ql,qr,nd*2+1,mid+1,r);
    return s1+s2;
}

vector<pair<pii,int>> vec;

void q2(int ql,int qr,int nd=1,int l=1,int r=n){
    if(l>r or l>qr or r<ql) return;
    if(ql<=l and r<=qr){
        vec.pb({{l,r},nd});
        return;
    }
    q2(ql,qr,nd*2,l,mid);
    q2(ql,qr,nd*2+1,mid+1,r);
}

void update(int pos,int val,int nd=1,int l=1,int r=n){
    if(l==r){
        t[nd].fi=t[nd].se=t2[nd].fi=t2[nd].se=val;
        return;
    }
    if(pos<=mid) update(pos,val,nd*2,l,mid);
    else update(pos,val,nd*2+1,mid+1,r);

    calc(nd,l,r);
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin>>n>>k;
    a.resize(n+1);
    FORE(i,1,n+1) cin>>a[i];

    build();

    int q;
    cin>>q;

    while(q--){
        int op;
        cin>>op;
        if(op==1){
            int el;
            vi tut;
            FOR(i,k){
                cin>>el;
                tut.pb(el);
            }

            int temp=a[tut[0]];
            FORE(i,1,k){
                update(tut[i-1],a[tut[i]]);
                a[tut[i-1]]=a[tut[i]];
            }
            update(tut[k-1],temp);
            a[tut[k-1]]=temp;
        }
        else{
            int l,r,m;
            cin>>l>>r>>m;

            int ara=r-l+1-m;
            int top=q1(l,r)*(ara+1);
            int cikar,cikar2;
            cikar=cikar2=0;

            pair<pii,int> cur;

            q2(l,l+ara-1);
            sort(all(vec));

            if(!vec.empty()){
                cur=vec[0];
                int tut=t[cur.se].se;
                cur.se=t[cur.se].fi;

                FORE(i,1,vec.size()){
                    int l=vec[i].fi.fi;
                    int r=vec[i].fi.se;
                    int nd=vec[i].se;

                    cur.se=cur.se+t[nd].fi+(r-l+1)*tut;
                    tut+=t[nd].se;
                    cur.fi.se=r;
                }

                cikar=cur.se;
                vec.clear();
            }

            /*********************************************** */

            q2(r-ara+1,r);
            sort(all(vec));

            if(!vec.empty()){
                cur=vec[0];
                cur.se=t2[cur.se].fi;

                FORE(i,1,vec.size()){
                    int l=vec[i].fi.fi;
                    int r=vec[i].fi.se;
                    int nd=vec[i].se;

                    cur.se=cur.se+t2[nd].fi+(cur.fi.se-cur.fi.fi+1)*(t2[nd].se);
                    cur.fi.se=r;
                }

                cikar2=cur.se;
                vec.clear();
            }   

            cout<<top-cikar-cikar2<<endl;
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...