Notice
Recent Posts
Recent Comments
Link
반응형
공부혜옹
백준 11505번 구간 곱 구하기 본문
update는 target 위치에 value값을 업데이트 해주고, 트리에서 a[idx-1]과 같은 값은 가지는 노드의 부모노드를 타고 올라가며 업데이트 해준다.
이때 범위가 벗어나는 경우 부모 노드가 양쪽 두 자식 값을 통해 곱을 재 연산하기 위해서 return A[index]를 해준다.
합처럼 일부만 갱신하는게 아닌, 해당 가지부분을 전체 갱신하여 재연산해주어야 된다.
#include <iostream>
using namespace std;
const int MOD = 1000000007;
int n, m, k;
long long A[4000000];
long long update(int index, int target, int value, int start, int end) {
if (start > target || end < target)
return A[index];
if (start == end)
return A[index] = value;
int mid = (start + end) / 2;
return A[index] = ((update(index * 2, target, value, start, mid) *
update(index * 2 + 1, target, value, mid + 1, end))) % MOD;
}
long long getMultiply(int index, int left, int right, int start, int end) {
if (left > end || right < start)
return 1;
else if (left <= start && end <= right)
return A[index];
int mid = (start + end) / 2;
return (getMultiply(index * 2, left, right, start, mid) *
getMultiply(index * 2 + 1, left, right, mid + 1, end)) % MOD;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> m >> k;
m += k;
int val;
for (int i = 1; i <= n; ++i) {
cin >> val;
update(1, i, val, 1, n);
}
int a, b, c;
while (m--) {
cin >> a >> b >> c;
if (a == 1) {
update(1, b, c, 1, n);
}
else {
cout << getMultiply(1, b, c, 1, n) << '\n';
}
}
return 0;
}
반응형
'공부합시다 > Algorithm' 카테고리의 다른 글
백준 9656번 돌게임2 (0) | 2021.05.11 |
---|---|
백준 9655번 돌게임 (0) | 2021.05.11 |
백준 2042번 구간 합 구하기 (0) | 2021.05.04 |
백준 1062번 가르침 (0) | 2021.04.27 |
백준 15787번 기차가 어둠을 헤치고 은하수를 (0) | 2021.04.24 |
Comments