제출 #829465

#제출 시각아이디문제언어결과실행 시간메모리
829465vuavisaoAddk (eJOI21_addk)C++17
0 / 100
68 ms6176 KiB
#include<bits/stdc++.h> #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #define ll long long using namespace std; const ll N = 1e5 + 10; struct SegTree { struct Node { ll val[2] = {0, 0}; Node() {}; Node operator + (const Node& other) const { Node res; res.val[0] = this -> val[0] + other.val[0]; res.val[1] = this -> val[1] + other.val[1]; return res; } }; ll n_node = 0; vector<Node> tree = {}; void resize(ll _n) { n_node = _n; tree.resize((n_node << 2) + 10); }; SegTree() {}; SegTree(ll _n) { this -> resize(_n); }; void update(ll node, ll l, ll r, ll idx, ll val) { if(l == r) { tree[node].val[0] = val; tree[node].val[1] = val * idx; return; } ll mid = (l + r) >> 1; if(idx <= mid) update(node << 1, l, mid, idx, val); else update(node << 1 | 1, mid + 1, r, idx, val); tree[node] = tree[node << 1] + tree[node << 1 | 1]; } void Update(ll idx, ll val) { return update(1, 1, n_node, idx, val); } Node query(ll node, ll l, ll r, ll L, ll R) { if(l > r || L > R || l > R || L > r) return Node(); if(L <= l && r <= R) return tree[node]; ll mid = (l + r) >> 1; return query(node << 1, l, mid, L, R) + query(node << 1 | 1, mid + 1, r, L, R); } Node Query(ll l, ll r) { return query(1, 1, n_node, l, r); } }; ll n, q, k; ll a[N]; int32_t main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> n >> k; for(ll i = 1; i <= n; ++ i) cin >> a[i]; cin >> q; SegTree st(n); for(ll i = 1; i <= n; ++ i) st.Update(i, a[i]); while(q-- > 0) { ll type; cin >> type; if(type == 1) { ll List[12], val_in_list[12]; for(ll i = 1; i <= k; ++ i) cin >> List[i], val_in_list[i] = a[List[i]]; for(ll i = 1; i <= k; ++ i) { ll j = i + 1; if(j > k) j -= k; a[List[i]] = val_in_list[j]; st.Update(List[i], a[List[i]]); } } else { ll l, r, m; cin >> l >> r >> m; ll le[2], ri[2], have[2] = {l - 1, r + 1}; le[0] = l, ri[0] = min(l + m - 1, r - m + 1); le[1] = max(ri[0] + 1, r - m + 1), ri[1] = r; ll res = 0; for(ll i = 0, sign = 1; i < 2; sign = - sign, ++ i) { if(le[i] > ri[i]) continue; // cout << le[i] << ' ' << ri[i] << '\n'; const auto& tmp = st.Query(le[i], ri[i]); // cout << tmp.val[1] << ' ' << tmp.val[0] << '\n'; // cout << tmp.val[1] * sign - sign * have[i] * tmp.val[0] << '\n'; res += tmp.val[1] * sign - sign * have[i] * tmp.val[0]; } if(ri[0] + 1 <= le[1] - 1) { res += st.Query(ri[0] + 1, le[1] - 1).val[0] * m; } cout << res << '\n'; } } return (0 ^ 0); } /// Code by vuavisao
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...