-
https://www.acmicpc.net/problem/2042
2042번: 구간 합 구하기
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)과 M(1 ≤ M ≤ 10,000), K(1 ≤ K ≤ 10,000) 가 주어진다. M은 수의 변경이 일어나는 횟수이고, K는 구간의 합을 구하는 횟수이다. 그리고 둘째 줄부터 N+1번째 줄
www.acmicpc.net
ll update
#include <bits/stdc++.h>using namespace std;#ifdef ONLINE_JUDGEconstexpr bool local = false;#elseconstexpr bool local = true;#endifusing ll = long long;using pi = pair<ll, ll>;ll n, m, k;vector<ll> a, segTree;ll init(ll i, ll s, ll e) {if (s == e) return segTree[i] = a[s];ll mid = (s + e) >> 1;return segTree[i] = init(2 * i, s, mid) + init(2 * i + 1, mid + 1, e);}ll update(ll i, ll s, ll e, ll idx, ll value) {if (e < idx || idx < s) return segTree[i];if (s == e) return segTree[i] = value;ll mid = (s + e) >> 1;return segTree[i] = update(2 * i, s, mid, idx, value) +update(2 * i + 1, mid + 1, e, idx, value);}ll query(ll i, ll s, ll e, ll l, ll r) {if (e < l || r < s) return 0;if (l <= s && e <= r) return segTree[i];ll mid = (s + e) >> 1;return query(2 * i, s, mid, l, r) + query(2 * i + 1, mid + 1, e, l, r);}int main(void) {if (!local) ios_base::sync_with_stdio(0), cin.tie(0);cin >> n >> m >> k;a.resize(n + 1);segTree.resize(4 * n);int i;for (i = 1; i <= n; i++) cin >> a[i];init(1, 1, n);for (i = 1; i <= m + k; i++) {ll op;cin >> op;if (op == 1) {ll idx, val;cin >> idx >> val;update(1, 1, n, idx, val);a[idx] = val;} else if (op == 2) {ll S, E;cin >> S >> E;cout << query(1, 1, n, S, E) << '\n';}}return 0;}
void update
#include <bits/stdc++.h>using namespace std;#ifdef ONLINE_JUDGEconstexpr bool local = false;#elseconstexpr bool local = true;#endifusing ll = long long;using pi = pair<ll, ll>;ll n, m, k;vector<ll> a, segTree;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(2 * i, s, mid) + init(2 * i + 1, mid + 1, e);}void update(ll i, ll s, ll e, ll idx, ll diff) {if (e < idx || idx < s) return;segTree[i] += diff;if (s != e) {ll mid = (s + e) / 2;update(2 * i, s, mid, idx, diff);update(2 * i + 1, mid + 1, e, idx, diff);}}ll query(ll i, ll s, ll e, ll l, ll r) {if (e < l || r < s) return 0;if (l <= s && e <= r) return segTree[i];ll mid = (s + e) / 2;return query(2 * i, s, mid, l, r) + query(2 * i + 1, mid + 1, e, l, r);}int main(void) {if (!local) ios_base::sync_with_stdio(0), cin.tie(0);cin >> n >> m >> k;a.resize(n + 1);segTree.resize(4 * n);int i;for (i = 1; i <= n; i++) cin >> a[i];init(1, 1, n);for (i = 1; i <= m + k; i++) {ll op;cin >> op;if (op == 1) {ll idx, val;cin >> idx >> val;update(1, 1, n, idx, val - a[idx]);a[idx] = val;} else if (op == 2) {ll S, E;cin >> S >> E;cout << query(1, 1, n, S, E) << '\n';}}return 0;}
'템플릿' 카테고리의 다른 글
VSCode에서 <bits/stdc++.h> precompile header 사용 (0) 2024.09.28 lazy 세그 (0) 2022.05.02 유니온파인드 (0) 2022.02.28 LIS + 역추적 (0) 2022.02.04