Submission #1268178

#TimeUsernameProblemLanguageResultExecution timeMemory
1268178rayan_bdAddk (eJOI21_addk)C++20
0 / 100
105 ms6012 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
struct segment_tree{
    vector<int> seg;
    int N;
    void init(int n){
        N = n;
        seg.resize(n * 4, 0);
    }
    void upd(int node, int start, int end, int idx, int val){
        if(start == end){
            seg[node] = val;
            return;
        }
        int mid = start + (end - start) / 2;
        if(idx <= mid) upd(node * 2 + 1, start, mid, idx, val);
        else upd(node * 2 + 2, mid + 1, end, idx, val);
        seg[node] = seg[node * 2 + 1] + seg[node * 2 + 2];
    }
    int query(int node, int start, int end, int l, int r){
        if(start > r || end < l) return 0;
        if(start >= l && end <= r) return seg[node];
        int mid = start + (end - start) / 2;
        return query(node * 2 + 1, start, mid, l, r)
             + query(node * 2 + 2, mid + 1, end, l, r);
    }
    void upd(int point, int val){
        upd(0, 1, N, point, val);
    }
    int query(int l, int r){
        if(l > r) return 0;
        return query(0, 1, N, l, r);
    }
} tr1, tr2, tr3;
signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(nullptr); cout.tie(nullptr);
    int n, k, q, t, l, r, m;
    cin >> n >> k;
    vector<int> a(n + 1, 0);
    for(int i = 1; i <= n; ++i){
        cin >> a[i];
    }
    tr1.init(n + 5), tr2.init(n + 5), tr3.init(n + 5);
    for(int i = 1; i <= n; ++i){
        tr1.upd(i, a[i] * i);
        tr2.upd(i, a[i] * (n - i + 1));
        tr3.upd(i, a[i]);
    }
    auto get = [&](int l, int r, int xx) -> int{
        if(l > r) return -1; 
        return tr3.query(l, r) * xx;
    };
    cin >> q;
    while(q--){
        cin >> t;
        if(t == 1){
            vector<int> pos(k);
            for(auto &it : pos) cin >> it;
            int tmp = a[pos[0]];
            for(int i = 0; i < (int) pos.size() - 1; ++i){
                a[pos[i]] = a[pos[i + 1]];
                tr1.upd(pos[i], a[pos[i + 1]] * pos[i]);
                tr2.upd(pos[i], a[pos[i + 1]] * (n - pos[i] + 1));
                tr3.upd(pos[i], a[pos[i + 1]]);
            }
            a[pos.back()] = tmp;
            tr1.upd(pos.back(), tmp * pos.back());
            tr2.upd(pos.back(), tmp * (n - pos.back() + 1));
            tr3.upd(pos.back(), tmp);
        }else{
cin >> l >> r >> m;
int len = r - l + 1;
long long ans = 0;

if (m == len) {
    ans = tr3.query(l, r);
} else {
    // left slope
    int L1 = l;
    int R1 = min(r, l + m - 1);
    ans += tr1.query(L1, R1) - tr3.query(L1, R1) * (l - 1);

    // middle
    int Lmid = l + m;
    int Rmid = r - m + 1;
    if (Lmid <= Rmid)
        ans += tr3.query(Lmid, Rmid) * m;

    // right slope
    int L2 = max(l, r - m + 1);
    int R2 = r;
    ans += (r + 1) * tr3.query(L2, R2) - tr1.query(L2, R2);
}

cout << ans << "\n";
        }
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...