https://www.acmicpc.net/problem/11505

 

우선 세그먼트 트리 이해 후 한번에 풀이 성공했다.

다만 좀 헷갈렸던 부분은 배열을 인덱스 0부터가 아니라 1부터 사용하는거라 트리쪽도 매개변수를 어떻게 넣어야 할지 잠시 고민했다.

근데 그냥 배열 index 1부터 입력받게 하니까 트리는 원래 index 1부터 쓰는거라 별 다르게 바꿀것 없이

0 ~ N - 1로 범위 지정할거를 1 ~ N으로 지정해주면 그만이었다.

 

정답코드)

#include <bits/stdc++.h>
using namespace std;

vector<int> arr;
vector<long long> SegmentTree;

void Make_SegmentTree(int Node, int Start, int End) 
{
	if (Start == End) SegmentTree[Node] = arr[Start];
	else {
		Make_SegmentTree(Node * 2, Start, (Start + End) / 2);
		Make_SegmentTree(Node * 2 + 1, (Start + End) / 2 + 1, End);
		SegmentTree[Node] = (SegmentTree[Node * 2] * SegmentTree[Node * 2 + 1]) % 1000000007;
	}
}

void Update_SegmentTree(int Node, int Start, int End, int Index, int Value) {
	if (Index < Start || Index > End) return;
	if (Start == End) {
		arr[Index] = Value;
		SegmentTree[Node] = Value;
		return;
	}

	Update_SegmentTree(Node * 2, Start, (Start + End) / 2, Index, Value);
	Update_SegmentTree(Node * 2 + 1, (Start + End) / 2 + 1, End, Index, Value);
	SegmentTree[Node] = (SegmentTree[Node * 2] * SegmentTree[Node * 2 + 1]) % 1000000007;
}

long long Multiple(int Node, int Start, int End, int Left, int Right) {
	if (Left > End || Right < Start) return 1;
	if (Left <= Start && End <= Right) return SegmentTree[Node];

	int Mid = (Start + End) / 2;
	long long Left_Result = Multiple(Node * 2, Start, Mid, Left, Right);
	long long Right_Result = Multiple(Node * 2 + 1, Mid + 1, End, Left, Right);
	return (Left_Result * Right_Result) % 1000000007;
}

int main()
{
	ios::sync_with_stdio(false); cin.tie(NULL);

	int N, M, K;
	cin >> N >> M >> K;

	// 입력받고
	arr.resize(N + 1, 0);
	for (int i = 1; i < N + 1; i++) {
		cin >> arr[i];
	}

	// 세그먼트트리 만들고
	int Tree_Height = (int)ceil(log2(N));
	int Tree_Size = (1 << (Tree_Height + 1));
	SegmentTree.resize(Tree_Size);
	Make_SegmentTree(1, 1, N);

	// 요청받고
	int a, b, c;
	for (int i = 0; i < M + K; i++) {
		cin >> a >> b >> c;

		if (a == 1) {
			// b번째수를 c로 변경
			Update_SegmentTree(1, 1, N, b, c);
		}
		else if (a == 2) {
			// b부터 c까지의 곱을 출력
			cout << Multiple(1, 1, N, b, c) << '\n';
		}
	}

	return 0;
}