diff --git "a/zinnnn37/202511/2 BOJ G1 \354\210\230\354\227\264\352\263\274 \354\277\274\353\246\254 17.md" "b/zinnnn37/202511/2 BOJ G1 \354\210\230\354\227\264\352\263\274 \354\277\274\353\246\254 17.md" new file mode 100644 index 00000000..4327de42 --- /dev/null +++ "b/zinnnn37/202511/2 BOJ G1 \354\210\230\354\227\264\352\263\274 \354\277\274\353\246\254 17.md" @@ -0,0 +1,99 @@ +```java +import java.io.*; +import java.util.StringTokenizer; + +public class BJ_14438_수열과_쿼리_17 { + + private static final int INF = Integer.MAX_VALUE; + + private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + private static final StringBuilder sb = new StringBuilder(); + private static StringTokenizer st; + + private static int N, M; + private static int[] nums, segTree; + + public static void main(String[] args) throws IOException { + init(); + sol(); + } + + private static void init() throws IOException { + N = Integer.parseInt(br.readLine()); + + nums = new int[N + 1]; + segTree = new int[N * 4]; + st = new StringTokenizer(br.readLine()); + for (int i = 1; i <= N; i++) { + nums[i] = Integer.parseInt(st.nextToken()); + } + + initSegTree(1, 1, N); + + M = Integer.parseInt(br.readLine()); + } + + private static void sol() throws IOException { + while (M-- > 0) { + st = new StringTokenizer(br.readLine()); + + int cmd = Integer.parseInt(st.nextToken()); + int a = Integer.parseInt(st.nextToken()); + int b = Integer.parseInt(st.nextToken()); + + if (cmd == 1) { + update(1, 1, N, a, b); + } else if (cmd == 2) { + bw.write(getMin(1, 1, N, a, b) + "\n"); + } + } + bw.flush(); + bw.close(); + br.close(); + } + + private static int initSegTree(int node, int start, int end) { + if (start == end) { + return segTree[node] = nums[start]; + } + + int mid = start + (end - start) / 2; + + return segTree[node] = Math.min(initSegTree(node * 2, start, mid), initSegTree(node * 2 + 1, mid + 1, end)); + } + + private static int update(int node, int start, int end, int target, int update) { + if (target < start || end < target) { + return segTree[node]; + } + + if (start == end) { + return segTree[node] = update; + } + + int mid = start + (end - start) / 2; + + int left = update(node * 2, start, mid, target, update); + int right = update(node * 2 + 1, mid + 1, end, target, update); + + return segTree[node] = Math.min(left, right); + } + + private static int getMin(int node, int start, int end, int left, int right) { + if (right < start || end < left) { + return INF; + } + + if (left <= start && end <= right) { + return segTree[node]; + } + + int mid = start + (end - start) / 2; + + return Math.min(getMin(node * 2, start, mid, left, right) + , getMin(node * 2 + 1, mid + 1, end, left, right)); + } + +} +``` \ No newline at end of file