제출 #630108

#제출 시각아이디문제언어결과실행 시간메모리
630108ZsofiaKeresztelyAddk (eJOI21_addk)C++14
100 / 100
1246 ms9652 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; vector<ll> lstairs, rstairs, pref; ll n; void upd(vector<ll> &a){ pref.assign(n+1, 0); lstairs.assign(n+1, 0); rstairs.assign(n+1, 0); for (ll i=1; i<n+1; i++){ pref[i] = pref[i-1] + a[i]; lstairs[i] = lstairs[i-1] + pref[i]; } rstairs[n] = a[n]; for (ll i=n-1; i>0; i--){ rstairs[i] = rstairs[i+1] + (pref[n] - pref[i-1]); } return; } int main(){ ll k; cin >> n >> k; vector<ll> a(n+1); vector<ll> orig; for (ll i=1; i<n+1; i++){ cin >> a[i]; } orig = a; upd(a); cerr << "\n"; ll q, type, val, l, r, m, sum, lastl, lastr, x; vector<ll> ind(k); set<ll> toupd; cin >> q; for (ll i=0; i<q; i++){ cin >> type; if (type == 1){ cin >> ind[0]; toupd.insert(ind[0]); val = a[ind[0]]; for (ll j=1; j<k; j++){ cin >> ind[j]; toupd.insert(ind[j]); a[ind[j-1]] = a[ind[j]]; } a[ind[k-1]] = val; val = toupd.size(); if (val * val >= n * k){ upd(a); orig = a; toupd.clear(); } cerr << "\n"; } else{ cin >> l >> r >> m; lastl = min(l+m-1, r-m+1); lastr = max(l+m-1, r-m+1); if (lastl == lastr){ lastr++; } sum = rstairs[l] - rstairs[lastl+1] - (lastl - l + 1) * (pref[n] - pref[lastl]) + lstairs[r] - lstairs[lastr-1] - (r - lastr + 1) * pref[lastr - 1] + (lastl - l + 1) * (pref[lastr-1] - pref[lastl]); for (auto i : toupd){ if (i > lastl && i < lastr){ x = lastl - l + 1; } else{ x = min(i - l + 1, r - i + 1); } if (x > 0){ sum += (a[i] - orig[i]) * x; } } cout << sum << "\n"; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...