๐Ÿ•๏ธ ICPC Sinchon/Segment Tree

[BOJ][C++] ๋ฐฑ์ค€ 2357๋ฒˆ: ์ตœ์†Ÿ๊ฐ’๊ณผ ์ตœ๋Œ“๊ฐ’ (Gold I)

์„ ๋‹ฌ 2025. 2. 4. 23:31
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

N(1 โ‰ค N โ‰ค 100,000)๊ฐœ์˜ ์ •์ˆ˜๋“ค์ด ์žˆ์„ ๋•Œ, a๋ฒˆ์งธ ์ •์ˆ˜๋ถ€ํ„ฐ b๋ฒˆ์งธ ์ •์ˆ˜๊นŒ์ง€ ์ค‘์—์„œ ์ œ์ผ ์ž‘์€ ์ •์ˆ˜, ๋˜๋Š” ์ œ์ผ ํฐ ์ •์ˆ˜๋ฅผ ์ฐพ๋Š” ๊ฒƒ์€ ์–ด๋ ค์šด ์ผ์ด ์•„๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด์™€ ๊ฐ™์€ a, b์˜ ์Œ์ด M(1 โ‰ค M โ‰ค 100,000)๊ฐœ ์ฃผ์–ด์กŒ์„ ๋•Œ๋Š” ์–ด๋ ค์šด ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ๋ณด์ž.
์—ฌ๊ธฐ์„œ a๋ฒˆ์งธ๋ผ๋Š” ๊ฒƒ์€ ์ž…๋ ฅ๋˜๋Š” ์ˆœ์„œ๋กœ a๋ฒˆ์งธ๋ผ๋Š” ์ด์•ผ๊ธฐ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด a=1, b=3์ด๋ผ๋ฉด ์ž…๋ ฅ๋œ ์ˆœ์„œ๋Œ€๋กœ 1๋ฒˆ, 2๋ฒˆ, 3๋ฒˆ ์ •์ˆ˜ ์ค‘์—์„œ ์ตœ์†Œ, ์ตœ๋Œ“๊ฐ’์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค. ๊ฐ๊ฐ์˜ ์ •์ˆ˜๋“ค์€ 1์ด์ƒ 1,000,000,000์ดํ•˜์˜ ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N, M์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” N๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ M๊ฐœ์˜ ์ค„์—๋Š” a, b์˜ ์Œ์ด ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

M๊ฐœ์˜ ์ค„์— ์ž…๋ ฅ๋ฐ›์€ ์ˆœ์„œ๋Œ€๋กœ ๊ฐ a, b์— ๋Œ€ํ•œ ๋‹ต์„ ์ตœ์†Ÿ๊ฐ’, ์ตœ๋Œ“๊ฐ’ ์ˆœ์„œ๋กœ ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ’€์ด

์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ~

// ํ’€์ด : https://whkakrkr.tistory.com

#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>

using namespace std;

typedef long long ll;

ll INF = 1000000001;

int n,m, sz,x;
vector<ll> maxTree;
vector<ll> minTree;

void updateTree(int i, int val) {
    int idx = i + sz - 1;
    
    maxTree[idx] = val;
    minTree[idx] = val;
    
    while(idx>1) {
        idx /= 2;
        minTree[idx] = min(minTree[idx*2], minTree[idx*2+1]);
        maxTree[idx] = max(maxTree[idx*2], maxTree[idx*2+1]);
    }
}

int getMinMax(int a, int b, bool isMax) {
    ll ans = isMax ? 0 : INF;
    vector<ll>&tree = isMax ? maxTree : minTree;
    
    int left = a + sz - 1;
    int right = b + sz - 1;
    
    while(left <= right) {
        if(left%2 == 1) {
            ans = isMax ? max(ans, tree[left]) : min(ans, tree[left]);
            left++;
        }
        left /= 2;;
        
        if(right%2 == 0) {
            ans = isMax ? max(ans, tree[right]) : min(ans, tree[right]);
            right--;
        }
        right /= 2;
        
    }
    
    return ans;
}


int main() {
    ios_base::sync_with_stdio(false);
	cout.tie(NULL);
	cin.tie(NULL);
	
	cin >> n >> m;
	sz = pow(2, floor(log2(4*n)-1));
	maxTree.assign(2*sz, 0);
	minTree.assign(2*sz, INF);
	for(int i=1; i<=n; i++) {
	    cin >> x;
	    updateTree(i, x);
	}
	
	int a, b;
	while(m--) {
	    cin >> a >> b;
	    cout << getMinMax(a,b,false) << " " << getMinMax(a,b,true) << "\n";
	}
	
    return 0;
}

 

๋ฐ˜์‘ํ˜•