Submission #622467

#TimeUsernameProblemLanguageResultExecution timeMemory
622467pakapuAddk (eJOI21_addk)C++14
100 / 100
1284 ms3972 KiB
#pragma GCC optimize ("O3") #include <iostream> #include <vector> using namespace std; long long tree[131071 * 2 - 1]; int sz; void init(int n) { sz = 1 << (32 - __builtin_clz(n - 1)); } void set(int pos, int val, int x, int lx, int rx) { if(rx - lx == 1) { tree[x] = val; return; } int mid = (lx + rx) / 2; if(pos >= mid) { set(pos, val, x * 2 + 2, mid, rx); } else { set(pos, val, x * 2 + 1, lx, mid); } tree[x] = tree[x * 2 + 1] + tree[x * 2 + 2]; } void set(int pos, int val) { set(pos, val, 0, 0, sz); } long long get(int l, int r, int x, int lx, int rx) { if(rx <= l || lx >= r) { return 0; } if(lx >= l && rx <= r) { return (long long)tree[x]; } int mid = (lx + rx) / 2; return get(l, r, x * 2 + 1, lx, mid) + get(l, r, x * 2 + 2, mid, rx); } long long get(int l, int r) { return get(l, r + 1, 0, 0, sz); } long long get_element(int x) { return tree[sz - 1 + x]; } void rebuild(int x, int lx, int rx) { if(rx - lx == 2) { tree[x] = tree[x * 2 + 1] + tree[x * 2 + 2]; return; } int mid = (lx + rx) / 2; rebuild(x * 2 + 1, lx, mid); rebuild(x * 2 + 2, mid, rx); tree[x] = tree[x * 2 + 1] + tree[x * 2 + 2]; } void rebuild() { rebuild(0, 0, sz); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, k; cin >> n >> k; init(n); for(int i = 0; i < n; i++) { long long tmp; cin >> tmp; set(i, tmp); } for(int i = n; i < sz; i++) { set(i, 0); } int q; cin >> q; while(q--) { int x; cin >> x; if(x == 1) { vector<int> a(k); vector<int> tmp(k); for(int i = 0; i < k; i++) { cin >> a[i]; a[i]--; //tmp[i] = sg.get(a[i], a[i]); tmp[i] = get_element(a[i]); } for(int i = 0; i < k; i++) { set(a[((i - 1) % k + k) % k], tmp[i]); } } else if(x == 2) { int l, r, m; cin >> l >> r >> m; l--; r--; long long s = 0; long long sprev = get(l, r); for(int i = 0; i < min(r - l + 1 - m + 1, m) && r - l + 1 - 2 * i > 0; i++) { s += sprev; sprev = sprev - get_element(l + i) - get_element(r - i); } cout << s << '\n'; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...