-
https://www.acmicpc.net/problem/10999
#include <bits/stdc++.h>using namespace std;#ifdef ONLINE_JUDGEconstexpr bool local = false;#elseconstexpr bool local = true;#endifusing ll = long long;ll n, m, k;vector<ll> a, segTree, lazy;void updateLazy(ll i, ll s, ll e) {if (lazy[i] != 0) {segTree[i] += (e - s + 1) * lazy[i];if (s != e) {lazy[i * 2] += lazy[i];lazy[i * 2 + 1] += lazy[i];}lazy[i] = 0;}}ll init(ll i, ll s, ll e) {if (s == e) return segTree[i] = a[s];ll mid = (s + e) / 2;return segTree[i] = init(i * 2, s, mid) + init(i * 2 + 1, mid + 1, e);}ll query(ll i, ll s, ll e, ll l, ll r) {updateLazy(i, s, e);if (l > e or r < s) return 0;if (l <= s and e <= r) return segTree[i];ll mid = (s + e) / 2;ll leftRes = query(i * 2, s, mid, l, r);ll rightRes = query(i * 2 + 1, mid + 1, e, l, r);return leftRes + rightRes;}void update(ll i, ll s, ll e, ll l, ll r, ll addVal) {updateLazy(i, s, e);if (e < l || r < s) return;if (l <= s && e <= r) {segTree[i] += (e - s + 1) * addVal;if (s != e) {lazy[i * 2] += addVal;lazy[i * 2 + 1] += addVal;}return;}ll mid = (s + e) / 2;update(i * 2, s, mid, l, r, addVal);update(i * 2 + 1, mid + 1, e, l, r, addVal);segTree[i] = segTree[i * 2] + segTree[i * 2 + 1];}int main(void) {if (!local) ios_base::sync_with_stdio(0), cin.tie(0);ll i, j;cin >> n >> m >> k;segTree.resize(n * 4);lazy.resize(n * 4);a.resize(n + 1);for (i = 1; i <= n; i++) cin >> a[i];init(1, 1, n);for (i = 0; i < m + k; i++) {ll op;cin >> op;if (op == 2) {ll A, B;cin >> A >> B;if (A > B) swap(A, B);cout << query(1, 1, n, A, B) << '\n';}if (op == 1) {ll A, B, C;cin >> A >> B >> C;update(1, 1, n, A, B, C);}}return 0;}
'템플릿' 카테고리의 다른 글
VSCode에서 <bits/stdc++.h> precompile header 사용 (0) 2024.09.28 유니온파인드 (0) 2022.02.28 LIS + 역추적 (0) 2022.02.04 세그트리 (0) 2021.11.14