제출 #1259349

#제출 시각아이디문제언어결과실행 시간메모리
1259349minhpkAddk (eJOI21_addk)C++20
100 / 100
609 ms11604 KiB
#include <bits/stdc++.h> #define int long long using namespace std; int a, b; int z[1000005]; vector<long long> bit; void bit_init(int n) { bit.assign(n+1, 0); } void bit_update(int i, long long v) { for (; i <= a; i += i & -i) bit[i] += v; } long long bit_query(int i) { long long s = 0; for (; i > 0; i -= i & -i) s += bit[i]; return s; } struct node { int l, r; long long val, val1; }; node f[4000005]; node combine(const node &A, const node &B) { if (A.l == 0) return B; if (B.r == 0) return A; node res; res.l = A.l; res.r = B.r; long long sumB = bit_query(B.r) - bit_query(B.l - 1); long long sumA = bit_query(A.r) - bit_query(A.l - 1); res.val = A.val + B.val + sumB * (A.r - A.l + 1); res.val1 = A.val1 + B.val1 + sumA * (B.r - B.l + 1); return res; } void build(int id, int l, int r) { if (l == r) { f[id].l = l; f[id].r = l; f[id].val = z[l]; f[id].val1 = z[l]; return; } int mid = (l + r) / 2; build(id*2, l, mid); build(id*2+1, mid+1, r); f[id] = combine(f[id*2], f[id*2+1]); } void update(int id,int l,int r,int pos,int val){ if (l==r){ f[id].val=f[id].val1=val; return; } int mid=(l+r)/2; if (pos<=mid){ update(id*2,l,mid,pos,val); }else{ update(id*2+1,mid+1,r,pos,val); } f[id]=combine(f[id*2],f[id*2+1]); } node get(int id, int l, int r, int x, int y) { if (x > r || y < l) return {0, 0, 0, 0}; if (l >= x && r <= y) return f[id]; int mid = (l + r) / 2; return combine( get(id*2, l, mid, x, y), get(id*2+1, mid+1, r, x, y) ); } signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> a >> b; bit_init(a); for (int i = 1; i <= a; i++) { cin >> z[i]; bit_update(i, z[i]); } build(1, 1, a); int q; cin >> q; while (q--) { int c; cin >> c; if (c == 1) { vector<int> idx(b); for (int i = 0; i < b; i++) cin >> idx[i]; vector<int> v; for (int i=1;i<b;i++){ v.push_back(z[idx[i]]); } v.push_back(z[idx[0]]); for (int i=0;i<b;i++){ bit_update(idx[i],-z[idx[i]]); z[idx[i]]=v[i]; bit_update(idx[i],z[idx[i]]); update(1,1,a,idx[i],z[idx[i]]); } } else { int l, r, t; cin >> l >> r >> t; int p = min(t, (r - l + 1) - t + 1); long long res = 0; res += get(1, 1, a, l, l + p - 1).val; res += get(1, 1, a, r - p + 1, r).val1; long long midSum = bit_query(r - p) - bit_query(l + p - 1); res += midSum * p; cout << res << '\n'; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...