Submission #623359

#TimeUsernameProblemLanguageResultExecution timeMemory
623359pakapuAddk (eJOI21_addk)C++14
100 / 100
1378 ms7668 KiB
    #pragma GCC optimize ("O3")
    #include <bits/stdc++.h>
     
    using namespace std;
     
    struct segtree {
     
        vector<long long> tree;
        int sz = 0;
     
        void init(int n) {
            sz = 1 << (32 - __builtin_clz(n - 1));
            tree.assign(sz * 2 - 1, 0);
        }
     
        void set(int pos, long long val, int x, int lx, int rx) {
            if(rx - lx == 1) {
                tree[x] = val;
                return;
            }
     
            int mid = (lx + rx) / 2;
     
            if(pos >= mid) {
                set(pos, val, x * 2 + 2, mid, rx);
            }
            else {
                set(pos, val, x * 2 + 1, lx, mid);
            }
     
            tree[x] = tree[x * 2 + 1] + tree[x * 2 + 2];
        }
     
        void set(int pos, long long val) {
            set(pos, val, 0, 0, sz);
        }
     
        long long get(int l, int r, int x, int lx, int rx) {
            if(rx <= l || lx >= r) {
                return 0;
            }
            if(lx >= l && rx <= r) {
                return tree[x];
            }
     
            int mid = (lx + rx) / 2;
            return get(l, r, x * 2 + 1, lx, mid) + get(l, r, x * 2 + 2, mid, rx);
        }
     
        long long get(int l, int r) {
            return get(l, r + 1, 0, 0, sz);
        }
     
        long long get_element(int x) {
            return tree[sz - 1 + x];
        }
     
        void set_element(int pos, long long val) {
            tree[sz - 1 + pos] = val;
        }
     
        void rebuild(int x, int lx, int rx) {
            if(rx - lx == 2) {
                tree[x] = tree[x * 2 + 1] + tree[x * 2 + 2];
                return;
            }
     
            int mid = (lx + rx) / 2;
            rebuild(x * 2 + 1, lx, mid);
            rebuild(x * 2 + 2, mid, rx);
            tree[x] = tree[x * 2 + 1] + tree[x * 2 + 2];
        }
        
        void rebuild() {
            rebuild(0, 0, sz);
        }
    };
     
    int main() {
        ios_base::sync_with_stdio(0);
        cin.tie(0);
        cout.tie(0);
     
        int n, k;
        cin >> n >> k;
     
        segtree sg;
        sg.init(n);
     
        for(int i = 0; i < n; i++) {
            long long tmp;
            cin >> tmp;
            sg.set_element(i, tmp);
        }
        sg.rebuild();
     
        int q;
        cin >> q;
        while(q--) {
            int x;
            cin >> x;
     
            if(x == 1) {
                vector<int> a(k);
                vector<long long> tmp(k);
     
                for(int i = 0; i < k; i++) {
                    cin >> a[i];
                    a[i]--;
                    //tmp[i] = sg.get(a[i], a[i]);
                    tmp[i] = sg.get_element(a[i]);
                }
                for(int i = 0; i < k; i++) {
                    sg.set(a[((i - 1) % k + k) % k], tmp[i]);
                }
            }
            else if(x == 2) {
                int l, r, m;
                cin >> l >> r >> m;
                l--;
                r--;
                long long s = 0;
                long long sprev = sg.get(l, r);
                for(int i = 0; i < min(r - l + 1 - m + 1, m) && r - l + 1 - 2 * i > 0; i++) {
                    s += sprev;
                    sprev = sprev - sg.get_element(l + i) - sg.get_element(r - i);
                }
                cout << s << '\n';
            }
        }
     
        return 0;
    }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...