티스토리 뷰

Algorithm/BOJ

2357 최소값과 최대값

henry1214 2018. 2. 6. 13:21

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



최소값과 최대값 각각에 대하여 세그먼트 트리를 만들어 준다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <cstdio>
#include <algorithm>
using namespace std;
 
int n,m,a[100001],maxt[400000],mint[400000];
 
void max_init(int node,int start,int end)
{
    if(start==end)
        maxt[node]=a[start];
    else
    {
        max_init(node*2,start,(start+end)/2);
        max_init(node*2+1,(start+end)/2+1,end);
        maxt[node]=max(maxt[node*2],maxt[node*2+1]);
    }
}
 
void min_init(int node,int start,int end)
{
    if(start==end)
        mint[node]=a[start];
    else
    {
        min_init(node*2,start,(start+end)/2);
        min_init(node*2+1,(start+end)/2+1,end);
        mint[node]=min(mint[node*2],mint[node*2+1]);
    }
}
 
int max_query(int node,int start,int end,int i,int j)
{
    if(j<start || end<i) return -1;
    if(i<=start && end<=j) return maxt[node];
    int max1=max_query(node*2,start,(start+end)/2,i,j);
    int max2=max_query(node*2+1,(start+end)/2+1,end,i,j);
    if(max1==-1return max2;
    else if(max2==-1return max1;
    else return max(max1,max2);
}
 
int min_query(int node,int start,int end,int i,int j)
{
    if(j<start || end<i) return -1;
    if(i<=start && end<=j) return mint[node];
    int min1=min_query(node*2,start,(start+end)/2,i,j);
    int min2=min_query(node*2+1,(start+end)/2+1,end,i,j);
    if(min1==-1return min2;
    else if(min2==-1return min1;
    else return min(min1,min2);
}
 
int main()
{
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++scanf("%d",&a[i]);
    max_init(1,1,n),min_init(1,1,n);
    while(m--)
    {
        int a,b;
        scanf("%d %d",&a,&b);
        printf("%d %d\n",min_query(1,1,n,a,b),max_query(1,1,n,a,b));
    }
    return 0;
}
cs


'Algorithm > BOJ' 카테고리의 다른 글

1956 운동  (0) 2018.02.06
1507 궁금한 민호  (0) 2018.02.06
11780 플로이드 2  (0) 2018.02.06
1197 최소 스패닝 트리  (0) 2018.02.06
2042 구간 합 구하기  (0) 2018.02.06
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday