Submission #1151220

#TimeUsernameProblemLanguageResultExecution timeMemory
1151220andrei_nAddk (eJOI21_addk)C++20
64 / 100
286 ms8112 KiB
#include <bits/stdc++.h> #define int long long using namespace std; int n; int Left[400005],Right[400005]; int sum[400005]; void _update(int st, int dr, int node, int p, int x) { if(st == dr) { Left[node] = Right[node] = x; sum[node] = x; } else { int mij = (st+dr)/2; if(p <= mij) _update(st, mij, node<<1, p, x); else _update(mij+1, dr, (node<<1)+1, p, x); sum[node] = sum[node<<1] + sum[(node<<1)+1]; Left[node] = Left[node<<1] + Left[(node<<1)+1] + sum[(node<<1)+1] * (mij - st + 1); Right[node] = Right[node<<1] + Right[(node<<1)+1] + sum[node<<1] * (dr - mij); } } void _query(int st, int dr, int node, int a, int b, int what, int &res) { if(st >= a && dr <= b) { if(what == 0) res += sum[node]; else if(what == 1) res += Left[node] + sum[node] * (st - a); else res += Right[node] + sum[node] * (b - dr); } else { int mij = (st+dr)/2; if(a <= mij) _query(st, mij, node<<1, a, b, what, res); if(b > mij) _query(mij+1, dr, (node<<1)+1, a, b, what, res); } } inline void update(int p, int x) { _update(1, n, 1, p, x); } inline int query(int what, int a, int b) { int res = 0; _query(1, n, 1, a, b, what, res); return res; } inline int query(int p) { return query(0, p, p); } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int k,x; cin>>n>>k; for(int i=1; i<=n; ++i) { cin>>x; update(i, x); } int q; cin>>q; while(q--) { int t; cin>>t; if(t == 1) { vector<int> idx(k); for(auto &i:idx) cin>>i; int val = query(idx.front()); for(int i=0; i<idx.size()-1; ++i) update(idx[i], query(idx[i+1])); update(idx.back(), val); } else { int l,r,m; cin>>l>>r>>m; int len = r-l+1; if(m > len/2) m = len+1-m; cout << query(1, l, l+m-1) + query(0, l+m, r-m) * m + query(2, r-m+1, r) << '\n'; } } return 0; } /* 8 3 7 2 5 1 9 3 4 6 3 2 2 7 4 1 2 5 8 2 2 7 3 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...