Submission #669736

#TimeUsernameProblemLanguageResultExecution timeMemory
669736bruvvAddk (eJOI21_addk)C++14
100 / 100
642 ms31188 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; #define pb push_back #define fi first #define si second #define ar array typedef pair<int,int> pi; typedef tuple<int,int,int> ti; template<typename T> bool chmin(T &a, T b){return (b < a) ? a = b, 1 : 0;} template<typename T> bool chmax(T &a, T b){return (b > a) ? a = b, 1 : 0;} mt19937 rng(chrono::system_clock::now().time_since_epoch().count()); void debug_out() {cerr<<endl;} template <typename Head, typename... Tail> void debug_out(Head _H, Tail... _T) {cerr<<" "<<to_string(_H);debug_out(_T...);} #define debug(...) cerr<<"["<<#__VA_ARGS__<<"]:",debug_out(__VA_ARGS__) const int MAXN = 1000010; int n, k, q; int arr[MAXN], ids[20]; struct node { int s,e,m; ll val, wsum; node *l, *r; node(int S,int E) { s=S, e=E, m=(s+e)/2; val = 0, wsum = 0; if (s!=e) { l = new node(s,m); r = new node(m+1,e); } } void set(int p, ll v) { if (s==e) val = v, wsum = v; else { if (p <= m) l->set(p, v); else r->set(p, v); val = l->val+r->val; wsum = l->wsum+r->wsum+r->val*(ll)(m-l->s+1); } } ll query(int x, int y) { if (s==x && e==y) return val; else if (y <= m) return l->query(x,y); else if (x > m) return r->query(x,y); else return l->query(x,m)+r->query(m+1,y); } ll get(int x, int y) { if (s==x && e==y) return wsum; else if (y <= m) return l->get(x,y); else if (x > m) return r->get(x,y); else return l->get(x,m)+r->get(m+1,y)+r->query(m+1,y)*(ll)(m-x+1); } } *st, *st2; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin.exceptions(ios::badbit | ios::failbit); cin >> n >> k; st = new node(1, n); st2 = new node(1, n); for (int i = 1; i <= n; ++i) { cin >> arr[i]; st->set(i, arr[i]); st2->set(n-i+1, arr[i]); } cin >> q; while (q--) { int op; cin >> op; if (op == 1) { for (int i = 1; i <= k; ++i) cin >> ids[i]; sort(ids+1,ids+1+k); for (int i = 1; i <= k; ++i) { if (i < k) swap(arr[ids[i]], arr[ids[i+1]]); st->set(ids[i], arr[ids[i]]); st2->set(n-ids[i]+1, arr[ids[i]]); } } else { int l,r,m; cin >> l >> r >> m; if (l+m-1 == r-m+1) { cout << st->get(l,l+m-1)+st2->get(n-r+1,n-(r-m+2)+1) << '\n'; continue; } if (l+m-1 > r-m+1) m = r-l-m+2; ll ans = st->get(l,l+m-1)+st2->get(n-r+1,n-(r-m+1)+1); if (r-m+1 > l+m) ans += st->query(l+m,r-m) * (ll)m; cout << ans << '\n'; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...