๋ฌธ์
๊ธธ์ด๊ฐ 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;
}
'๐๏ธ ICPC Sinchon > Segment Tree' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ][C++] ๋ฐฑ์ค 11505๋ฒ: ๊ตฌ๊ฐ ๊ณฑ ๊ตฌํ๊ธฐ (Gold I) (0) | 2025.02.06 |
---|---|
[BOJ][C++] ๋ฐฑ์ค 2357๋ฒ: ์ต์๊ฐ๊ณผ ์ต๋๊ฐ (Gold I) (0) | 2025.02.04 |
[BOJ][C++] ๋ฐฑ์ค 2042๋ฒ: ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ (Gold I) (0) | 2025.02.04 |