본문 바로가기

삼성전자 알고리즘/정올

13. 1726 : 구간의 최대값1

문제 출처 : http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=999&sca=50&sfl=wr_hit&stx=1726&sop=and

 

JUNGOL | 구간의 최대값1 > 문제은행

제한시간: 1000 ms    메모리제한: 128 MB 해결횟수: 1300 회    시도횟수: 3132 회    입력의 첫번째 줄에는 수열을 이루는 원소의 갯수 N(1≤N≤50,000)과 구간의 갯수 Q(1≤Q≤200,000)가 공백을 사이에 두고 입력된다. 그 다음 N개의 줄에는 순서대로 서있는 원소의 숫자가 한줄에 하나씩 입력되는데, 이는 1이상 1,000,000이하이다. 그 다음  Q개의 구간의 시작 인덱스와 끝 인덱스 A, B가 공백을 사이에 두고

www.jungol.co.kr

문제 풀이 : 

#include <stdio.h>
#define MAX 50000
int tree[MAX * 3];
int N, Q;
void update(int node, int s, int e, int idx, int data) {
    int m;
    if (s == e) {
        tree[node] = data;
        return;
    }
    m = (s + e) / 2;
    if (idx <= m) update(node * 2, s, m, idx, data);
    else update(node * 2 + 1, m + 1, e, idx, data);
    tree[node] = (tree[node * 2] > tree[node * 2 + 1] ? tree[node * 2] : tree[node * 2 + 1]);
}
int query(int node, int s, int e, int qs, int qe) {
    int m, l, r;
    if (qs <= s && e <= qe) return tree[node];
    else if (qe < s || e < qs) return 0;//범위를 넘어서는 경우
    m = (s + e) / 2;
    l = query(node * 2, s, m, qs, qe);
    r = query(node * 2 + 1, m + 1, e, qs, qe);
    return (l > r) ? l : r;
}
 
int main() {
    int i, data, qs, qe;
    scanf("%d %d", &N, &Q);
    for (i = 1; i <= N; i++) {
        scanf("%d", &data);
        update(1, 1, N, i, data);
    }
    for (i = 1; i <= Q; i++) {
        scanf("%d %d", &qs, &qe);
        printf("%d\n", query(1, 1, N, qs, qe));
    }
}

'삼성전자 알고리즘 > 정올' 카테고리의 다른 글

15. 3203 : 꿀벌의 여행  (0) 2019.07.16
14. 1133 : Uniqueness  (0) 2019.06.28
12. 1141 : 불쾌한 날  (0) 2019.06.28
11. 1318 : 못생긴 수  (0) 2019.06.16
10. 2788 : 도약  (0) 2019.06.16