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

[BOJ][C++] ๋ฐฑ์ค€ 14428๋ฒˆ: ์ˆ˜์—ด๊ณผ ์ฟผ๋ฆฌ 16 (Gold I)

์„ ๋‹ฌ 2025. 2. 6. 05:19
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

๊ธธ์ด๊ฐ€ N์ธ ์ˆ˜์—ด A1, A2, ..., AN์ด ์ฃผ์–ด์ง„๋‹ค. ์ด๋•Œ, ๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.
์ˆ˜์—ด์˜ ์ธ๋ฑ์Šค๋Š” 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ˆ˜์—ด์˜ ํฌ๊ธฐ N์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 100,000)
๋‘˜์งธ ์ค„์—๋Š” A1, A2, ..., AN์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ Ai≤ 109)
์…‹์งธ ์ค„์—๋Š” ์ฟผ๋ฆฌ์˜ ๊ฐœ์ˆ˜ M์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ M ≤ 100,000)
๋„ท์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์—๋Š” ์ฟผ๋ฆฌ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

2๋ฒˆ ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด์„œ ์ •๋‹ต์„ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ’€์ด

[๐Ÿ•๏ธ ICPC Sinchon/Segment Tree] - [BOJ][C++] ๋ฐฑ์ค€ 2357๋ฒˆ: ์ตœ์†Ÿ๊ฐ’๊ณผ ์ตœ๋Œ“๊ฐ’ (Gold I)

 

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

https://www.acmicpc.net/problem/2357 ๋ฌธ์ œN(1 ≤ N ≤ 100,000)๊ฐœ์˜ ์ •์ˆ˜๋“ค์ด ์žˆ์„ ๋•Œ, a๋ฒˆ์งธ ์ •์ˆ˜๋ถ€ํ„ฐ b๋ฒˆ์งธ ์ •์ˆ˜๊นŒ์ง€ ์ค‘์—์„œ ์ œ์ผ ์ž‘์€ ์ •์ˆ˜, ๋˜๋Š” ์ œ์ผ ํฐ ์ •์ˆ˜๋ฅผ ์ฐพ๋Š” ๊ฒƒ์€ ์–ด๋ ค์šด ์ผ์ด ์•„๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ

whkakrkr.tistory.com

์œ„์—์„œ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜๋Š” ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๋ฅผ ์‘์šฉํ•œ ๋ฒ„์ „์ด๋‹ค

์‘์šฉ์ด๋ž˜๋ดค์ž.. ์„ธ๊ทธ๋จผํŠธํŠธ๋ฆฌ์— ๊ฐ’๋งŒ ์ €์žฅํ•˜๋˜ ๊ธฐ์กด ํ˜•์‹์—์„œ

pair ์ž๋ฃŒํ˜•์„ ์ด์šฉํ•ด ์ธ๋ฑ์Šค์™€ ๊ฐ’์„ ๊ฐ™์ด ์ €์žฅํ•˜๋ฉด ๋œ๋‹ค.

 

์ด๋•Œ ๊ฐ’์ด ๊ฐ™์€ ๊ฒฝ์šฐ๋„ ๊ณ ๋ คํ•ด์•ผํ•˜๋ฏ€๋กœ 

pair๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๊ฐ’๊ณผ ์ธ๋ฑ์Šค๋ฅผ ๋น„๊ตํ•ด์„œ ๋ญ˜ ๋” ์ž‘์€๊ฑธ๋กœ ์„ ํƒํ• ์ง€ ๊ตฌํ•ด์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ด์ฃผ์ž

typedef pair<ll, ll> ci;

ci smaller(ci a, ci b) {
    if(a.second == b.second) {
        return a.first<b.first ? a : b;
    }
    return a.second<b.second ? a : b;
}

 

์ฝ”๋“œ

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

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

using namespace std;

typedef long long ll;
typedef pair<ll, ll> ci;

const ll INF = 1000000001;

int n,m,i, sz;
vector<ci>segment;

ci smaller(ci a, ci b) {
    if(a.second == b.second) {
        return a.first<b.first ? a : b;
    }
    return a.second<b.second ? a : b;
}

// b๋ฒˆ์งธ ์ˆ˜๋ฅผ c๋กœ ๋ฐ”๊พผ๋‹ค
void updateSegment(ll i, ll v) {
    ll idx = i + sz - 1;
    
    segment[idx] = {i, v};
    
    while(idx!=1) {
        idx /= 2;
        segment[idx] = smaller(segment[idx*2], segment[idx*2 + 1]);
    }
}

// b๋ถ€ํ„ฐ c๊นŒ์ง€์˜ ๊ตฌ๊ฐ„ํ•ฉ
ll getMin(ll b, ll c) {
    ll left = b + sz - 1;
    ll right = c + sz - 1;
    
    ci ans = {0, INF};
    
    while(left <= right) {
        if(left%2 == 1) {
            ans = smaller(segment[left], ans);
            left++;
        }
        left = left/2;

        if(right%2 == 0) {
            ans = smaller(segment[right], ans);
            right--;
        }
        right = right/2;
    }
    
    return ans.first;
}

int main() {
    ios_base::sync_with_stdio(false);
	cout.tie(NULL);
	cin.tie(NULL);
	
	ll a,b,c;
	cin >> n;
	
	// ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ ์ •์˜
	sz = pow(2, floor(log2(4*n))-1);
	segment.assign(sz*2, {0,INF});
	for(ll i=1; i<=n; i++) {
	    cin >> a;
	    updateSegment(i, a);
	}
	
	// ์ฟผ๋ฆฌ ์‹คํ–‰
	cin >> m;
	for(ll i=0; i<m; i++) {
	    cin >> a >> b >> c;
	    
	    if(a==1) { // update tree
	        updateSegment(b, c);
	    } else if(a==2) { // get sum
	        cout << getMin(b, c) << "\n";
	    }
	}
	
    return 0;
}
๋ฐ˜์‘ํ˜•