문제 출처 : 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 |