본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 11505 구간 곱 구하기

by 까망 하르방 2021. 2. 20.
반응형

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

 Input 

5 2 2

1

2

3

4

5

1 3 6

2 2 5

1 5 2

2 3 5

  

 Output 

240

48

배열의 특정 구간이 자주 변경되므로 세그먼트 트리(Segment Tree)를 이용합니다.

 

곱셈의 특성상 구간의 곱을 가지고 있으면 무수히 커질 수 있기 때문에 문제에서 모듈러연산을 요구합니다.

최종 결과에만 모듈러연산을 해준다면 노드가 가지고 있는 값이 Overflow 될 수 있으므로

노드가 가진 값을 갱신할 때도 % 연산 처리 합니다.


#include <cstdio>
#include <algorithm>
#include <cstring>
#define MOD 1000000007
#define LM 1000000
typedef long long ll;
using namespace std;
ll val, a, b;
ll tree[4 * LM];
 
ll update(ll idx, ll val, ll node, ll start, ll end) {
    if (end < idx || idx < start)
        return tree[node];
    if (start == end) // 단말 노드(Leaf Node)인 경우
        return tree[node] = val;
 
    ll mid = (start + end) >> 1;
    return tree[node] = (update(idx, val, node * 2, start, mid) 
        * update(idx, val, node * 2 + 1, mid + 1, end)) % MOD;
}
 
ll query(ll node, ll start, ll end, ll qLeft, ll qRight) {
    if (end < qLeft || qRight < start)
        return 1;
    if (qLeft <= start && end <= qRight)
        return tree[node];
 
    ll mid = (start + end) >> 1;
    return (query(node * 2, start, mid, qLeft, qRight) 
        * query(node * 2 + 1, mid + 1, end, qLeft, qRight)) % MOD;
}
 
int main() {
    int i, N, M, K, cmd;
    scanf("%d %d %d", &N, &M, &K);
 
    for (i = 1; i <= N; i++) {
        scanf("%lld", &val);
        update(i, val, 1, 1, N);
    }
    for (i = 0; i < M + K; i++) {
        scanf("%d %lld %lld", &cmd, &a, &b);
        if (cmd == 1)
            update(a, b, 1, 1, N);
        else 
            printf("%lld\n", query(1, 1, N, a, b));
    }
}

반응형

'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 10868 최솟값  (0) 2021.02.20
[BOJ] 백준 2357 최솟값과 최댓값  (0) 2021.02.20
[BOJ] 백준 13458 시험감독  (0) 2021.02.20
[BOJ] 백준 2531 회전초밥  (0) 2021.02.20
[BOJ] 백준 2805 나무 자르기  (0) 2021.02.20

댓글