-
[15967] 에바쿰BOJ 2022. 5. 2. 01:09
https://www.acmicpc.net/problem/15967
15967번: 에바쿰
재성이가 재혁이를 때린 날수 N과 재성이가 변덕을 부린 날의 개수 Q1, 재혁이가 얼마나 맞았는지 궁금한 구간의 개수 Q2가 주어진다. (1 ≤ N ≤ 1,000,000, 0 ≤ Q1, Q2 ≤ 10,000) 그 다음줄엔 재혁이가 i
www.acmicpc.net
구간합쿼리, 구간업데이트이므로 "[10999] 구간 합 구하기 2" 와 같은 문제
#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 == 1) {ll A, B;cin >> A >> B;if (A > B) swap(A, B);cout << query(1, 1, n, A, B) << '\n';} else if (op == 2) {ll A, B, C;cin >> A >> B >> C;update(1, 1, n, A, B, C);}}return 0;}
'BOJ' 카테고리의 다른 글
[1283] 단축키 지정 (0) 2022.05.02 [24445] 알고리즘 수업 - 너비 우선 탐색 2 (0) 2022.05.02 [13900] 순서쌍의 곱의 합 (0) 2022.04.27 [2784] 가로 세로 퍼즐 (0) 2022.04.27 [1107] 리모컨 (0) 2022.04.25