Submission #1318185

#TimeUsernameProblemLanguageResultExecution timeMemory
1318185jesusargAddk (eJOI21_addk)C++20
100 / 100
91 ms5832 KiB
#include <bits/stdc++.h> #define int long long using namespace std; vector<int> tree(2e5+3), treep(2e5+3), vet(1e5+5); int n; void build(){ for(int i = 0; i < n; i++){ tree[n+i]=vet[i]; treep[n+i]=vet[i]*(i+1); } for(int i = n-1; i > 0; i--){ tree[i]=tree[i<<1]+tree[i<<1|1]; treep[i]=treep[i<<1]+treep[i<<1|1]; } } void update(int pos, int v){ vet[pos]=v; int p=pos+n; tree[p]=v; treep[p]=v*(pos+1); for(p >>= 1; p>0; p>>=1){ tree[p]=tree[p<<1]+tree[p<<1|1]; treep[p]=treep[p<<1]+treep[p<<1|1]; } } int query1(int l, int r){ int ans=0; l+=n; r+=n; while(l<r){ if(l&1) ans+=tree[l++]; if(r&1) ans+=tree[--r]; l>>=1; r>>=1; } return ans; } int query2(int l, int r){ int ans=0; l+=n; r+=n; while(l<r){ if(l&1) ans+=treep[l++]; if(r&1) ans+=treep[--r]; l>>=1; r>>=1; } return ans; } int32_t main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int k; cin >> n >> k; for(int i = 0; i < n; i++) cin >> vet[i]; build(); int q; cin >> q; while(q--){ int t; cin >> t; if(t&1){ vector<int> idx(k), vals(k); for(int i = 0; i < k; i++){ cin >> idx[i]; idx[i]--; vals[i]=vet[idx[i]]; } for(int i = 0; i < k; i++){ update(idx[i],vals[(i+1)%k]); } }else{ int l, r, m; cin >> l >> r >> m; int len = r-l+1; int h = min(m,len-m+1); int p1 = l+h-1; int p2 = r-h+1; int ans = 0; if(p1<p2){ ans+=query2(l-1, p1)-(l-1)*query1(l-1, p1); ans+=h*query1(p1, p2-1); ans+=(r+1)*query1(p2-1, r)-query2(p2-1, r); }else{ int mid=(l+r)/2; ans+=query2(l-1, mid)-(l-1)*query1(l-1, mid); ans+=(r+1)*query1(mid, r)-query2(mid,r); } cout << ans << '\n'; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...