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...