Submission #1198246

#TimeUsernameProblemLanguageResultExecution timeMemory
1198246AzeTurk810Addk (eJOI21_addk)C++20
100 / 100
139 ms11592 KiB
// Telebe of adicto yani AzeTurk810
//
// WHY ARE YOU STARING MY CODE Stranger ??!!
//
//GO AWAY AND DON T look my CODE if i don t know you or you are stalker !!!!(hrrr)
//
// here about me: I am alone of course, fun , ' , ' , love pyhcics , young(child) , love music , had birds , not a gamer , chess :) , dead to football , you are looking to code , ... ;
//
// why at 1 japon army march they say "the enemy geniral is a hero , an equal to no one. Both in glory and in victory
// the men that follow him are also brave , fearless wariors ..."?(brave sozu feedback lere gore duzeldilmisdir)
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

# define ln '\n'
# define INFi 1e9
# define INFll 1e18
# define MOD int(1e9 + 7)

struct node
{
    ll az , nor , cox;
};

node c(node &l , node &r , ll sizel , ll sizer) {
    return {l.az + l.nor * sizer + r.az , l.nor + r.nor , l.cox + r.cox + sizel * r.nor};
}

int xl , xr;

struct segTree
{
    vector<node> t;
    segTree(int n) {
        t.resize(n * 4);
    }
    void build(int v , int l , int r , vector<int> &a) {
        if(l == r) {
            t[v].nor = a[l];
            t[v].az = a[l];
            t[v].cox = a[l];
            return;
        }
        int mid = (l + r) >> 1;
        build((v << 1) , l , mid , a);
        build((v << 1)|1 , mid + 1 , r , a);
        t[v] = c(t[(v << 1)] , t[(v<<1)|1] , mid - l + 1 ,r - mid);
    }
    void upd(int v , int l , int r , int pos , int val) {
        // cerr << l << '|'<< r << endl;
        if(l == r) {
            t[v].nor = val;
            t[v].az = val;
            t[v].cox = val;
            return;
        }
        int mid = (l + r) >> 1;
        if(mid >= pos)upd((v << 1) , l , mid , pos , val);
        else upd((v << 1)|1 , mid + 1 , r , pos , val);
        t[v] = c(t[(v << 1)] , t[(v<<1)|1] , mid - l + 1 ,r - mid);
    }
    ll ask(int v , int l , int r , int ql , int qr , int m) {
        if(ql > r || qr < l) return 0;
        // cerr << l << ' ' << r << ' ' << xl << ' ' << xr << ' ' << t[v].cox << ' ' << t[v].nor << ' ' << t[v].az << endl;
        if(ql <= l && r <= qr) {
            if(qr - ql + 1 == m)return t[v].nor;
            if((xl<= l && r <= xr)) {
                // cout << l << '|' << r<< ' ' << t[v].nor * (xl - ql + 1) << endl;
                return t[v].nor * (xl - ql + 1);
            }
            if(r <= xl) {
                // cout << l << ':' << r<< ' ' << t[v].cox + (l - ql) * t[v].nor << endl;
                return t[v].cox + (l - ql) * t[v].nor;
            }
            if(xr <= l) {
                // cout << l << ':' << r<< ' ' << t[v].az + (qr - r) * t[v].nor << endl;
                return t[v].az + (qr - r) * t[v].nor;
            }
        }
        int mid = (l + r) >> 1;
        return ask((v << 1) , l , mid , ql , qr , m) + ask((v << 1) | 1 , mid + 1 , r , ql , qr , m);
    }
};

void siw(vector<int> &a , vector<int> &w , segTree &t) {
    int ff = a[w[0]];
    vector<int> nums;
    for(int i : w) {
        nums.push_back(a[i]);
    }
    for(int i = 1; i < w.size() ; i ++) {
        a[w[i- 1]] = nums[i];
        t.upd(1 , 0 , a.size() - 1 , w[i - 1] , nums[i]);
    }
    a[w[w.size() - 1]] = ff;
    t.upd(1 , 0 , a.size() - 1 , w.back() , ff);
}

void solve() {
    int n , k;
    cin >> n >> k;
    vector<int> a(n);
    for(int &i : a) cin >> i;
    segTree t(n);
    t.build(1 , 0 , n - 1, a);
    int q;
    vector<int> sw(k);
    cin >> q;
    while(q--) {
        int tt;
        cin >> tt;
        if(tt == 1) {
            for(int i = 0 ; i < k ; i ++) {
                cin >> sw[i];
                sw[i]--;
            }
            siw(a , sw , t); 
        } else {
            int l , r , m;
            cin >> l >> r >> m;
            l--;r--;
            xl = l + m - 1;
            xr = r - m + 1;
            if(xl > xr)swap(xl , xr);
            cout << t.ask(1 , 0 , n - 1 , l , r , m) << ln;
        }
    } 
    // for(int i = 0; i <n ; i ++) {
    //     cerr << a[i] << ' ';
    // }
} 


signed main() {
    ios_base::sync_with_stdio(false); 
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    // cin >> t;
    while(t--)solve();
}
/*
5 1
1 2 3 4 5
3 
2 1 2 1
2 1 2 2
2 1 3 1


Test: 2 ci dehvdir , 6 vermelidir 5 verir , niye? , sehv basarliyla onarildi
3 cu sehv verir , 3 vermelidir , 6 verir , sehv onarildi
4 cu duzdur.
5 1
1 1 1 1 1
4
2 1 5 1
2 1 4 2
2 1 3 3
2 1 2 2

kod sehv verdi , yeni tsk:abort
8 4
1 1 1 2 1 1 1 1
10
2 1 8 7
2 1 8 6
1 2 3 4 5
2 1 8 7
2 1 8 6
2 3 3 1
2 1 5 3
2 1 8 3
2 1 8 2
2 3 8 2
cavab:
16
21
16
21
2
12
21
16
11
cixis:abort
24
24
23
23
2
12
21
16
11
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...