공부혜옹

백준 11505번 구간 곱 구하기 본문

공부합시다/Algorithm

백준 11505번 구간 곱 구하기

Blair06 2021. 5. 4. 20:46

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