Submission #774776

#TimeUsernameProblemLanguageResultExecution timeMemory
774776vjudge1Addk (eJOI21_addk)C++17
100 / 100
81 ms5216 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int NM = 1e6, KM = 10; int N, K, Q, a[NM+5]; int bit[NM+5], bit2[NM+5]; int idx[KM+5], b[NM+5]; void update(int bit[NM+5], int p, int v){ while (p <= N){ bit[p] += v; p += p & (-p); } } int get(int bit[NM+5], int p){ int res = 0; while (p > 0){ res += bit[p]; p -= p & (-p); } return res; } void modify(){ for (int i = 1; i < K; i++) b[idx[i]] = a[idx[i+1]]; b[idx[K]] = a[idx[1]]; for (int i = 1; i <= K; i++){ update(bit, idx[i], b[idx[i]]-a[idx[i]]); update(bit2, idx[i], (b[idx[i]]-a[idx[i]])*idx[i]); a[idx[i]] = b[idx[i]]; } } int get(int l, int r){ return get(bit, r)-get(bit, l-1); } int get1(int l, int r){ return get(bit2, r)-get(bit2, l-1)-(l-1)*get(l, r); } int get2(int l, int r){ return -get1(l, r)+(r-l+2)*get(l, r); } void query(int l, int r, int m){ int t = min(m, r-l-m+2); cout << get1(l, l+t-2)+get(l+t-1, r-t+1)*t+get2(r-t+2, r) << '\n'; } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> N >> K; for (int i = 1; i <= N; i++){ cin >> a[i]; update(bit, i, a[i]); update(bit2, i, a[i]*i); } cin >> Q; while (Q--){ int type; cin >> type; if (type == 1){ for (int i = 1; i <= K; i++) cin >> idx[i]; modify(); } else{ int l, r, m; cin >> l >> r >> m; query(l, r, m); } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...