제출 #1354861

#제출 시각아이디문제언어결과실행 시간메모리
1354861rana_azkaAddk (eJOI21_addk)C++20
100 / 100
329 ms190456 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long

const int INF = 1e18;
const int MOD = 1e9+7;
const int MAXN = 2e6;

#define md ((lf+rg)/2)
#define lc (pos*2)
#define rc (pos*2+1)

struct node{
    int sum = 0;
    int dariKiri = 0;
    int dariKanan = 0;

    node(){
        sum = 0;
        dariKiri = 0;
        dariKanan = 0;
    }
};

int n, m;
int k;
int arr[MAXN+5];
node segtree[4*MAXN+5];

node merge(node a, node b){
    node ret;
    ret.sum = a.sum + b.sum;
    ret.dariKiri = a.dariKiri + b.dariKiri;
    ret.dariKanan = a.dariKanan + b.dariKanan;
    return ret;
}

void build(int lf, int rg, int pos){
    if(lf == rg){
        segtree[pos].sum = arr[lf];
        segtree[pos].dariKiri = arr[lf] * (n - lf + 1);
        segtree[pos].dariKanan = arr[lf] * (lf);
        return ;
    }

    build(lf, md, lc);
    build(md+1, rg, rc);

    segtree[pos] = merge(segtree[lc], segtree[rc]);
}

void update(int idx, int val, int lf, int rg, int pos){
    if(lf == rg){
        segtree[pos].sum = val;
        segtree[pos].dariKiri = val * (n - lf + 1);
        segtree[pos].dariKanan = val * (lf);
        return ;
    }

    if(idx <= md) update(idx, val, lf, md, lc);
    else update(idx, val, md+1, rg, rc);

    segtree[pos] = merge(segtree[lc], segtree[rc]);
}
void update(int ql, int qr){ update(ql, qr, 1, n, 1); }

node query(int ql, int qr, int lf, int rg, int pos){
    node ret;
    if(qr < lf || rg < ql) return ret;
    if(ql <= lf && rg <= qr) return segtree[pos];
    return merge(query(ql, qr, lf, md, lc), query(ql, qr, md+1, rg, rc));
}
node query(int ql, int qr){ return query(ql, qr, 1, n, 1); }

void solve(){
    cin >> n >> k;
    for(int i = 1; i <= n; i++) cin >> arr[i];

    build(1, n, 1);

    int q; cin >> q;
    while(q--){
        int tipe; cin >> tipe;

        if(tipe == 1){
            vector<int> idx;
            for(int i = 0; i < k; i++){
                int x; cin >> x;
                idx.push_back(x);
            }

            int temp = arr[idx[0]];
            for(int i = 0; i < k - 1; i++) arr[idx[i]] = arr[idx[i+1]];
            arr[idx[k-1]] = temp;

            for(int i = 0; i < k; i++) update(idx[i], arr[idx[i]]);
        }else{
            int l, r, rng; cin >> l >> r >> rng;

            int contribute = min(rng, (r - l + 1) - rng + 1);
            int ans = query(l, r).sum * contribute;
            // cerr << "cek1 : " << query(l, r).sum * contribute << endl;
            
            int batasKiri = l + contribute - 1;
            ans -= query(l, batasKiri).dariKiri - (query(l, batasKiri).sum * (n - batasKiri + 1));
            // cerr << "cek2 : " << query(l, batasKiri).dariKiri << " - " << (query(l, batasKiri).sum * (n - batasKiri + 1)) << endl;

            int batasKanan = r - contribute + 1;
            ans -= query(batasKanan, r).dariKanan - (query(batasKanan, r).sum * (batasKanan));
            // cerr << "cek3 : " << query(batasKanan, r).dariKanan << " - " << (query(batasKanan, r).sum * (batasKanan)) << endl;

            // cerr << "=> ";
            cout << ans << endl;
            if(ans == 0) exit(0);
        }
    }
}

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

    int tc = 1;
    // cin >> tc;
    while(tc--){
        solve();
    }

    return 0;
}

/*
8 3
7 2 5 1 9 3 4 6
3
2 2 7 4
1 2 5 8
2 2 7 3
=> 
52
50
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...