| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1354851 | rana_azka | Addk (eJOI21_addk) | C++20 | 0 ms | 0 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 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] * (i);
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 * (i);
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];
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];
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;
int batasKiri = l + contribute - 1
ans -= query(l, batasKiri).dariKiri - (query(l, batasKiri).sum * contribute);
int batasKanan = r - contribute + 1;
ans -= query(batasKanan, r).dariKanan - (query(batasKanan, r).sum * contribute);
// cerr << "=> ";
cout << ans << endl;
}
}
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int tc = 1;
// cin >> tc;
while(tc--){
solve();
}
return 0;
}