diff --git "a/ShinHeeEul/202502/04 BOJ P4 \354\210\230\354\227\264\352\263\274 \354\277\274\353\246\254 21.md" "b/ShinHeeEul/202502/04 BOJ P4 \354\210\230\354\227\264\352\263\274 \354\277\274\353\246\254 21.md" new file mode 100644 index 00000000..4384d1f6 --- /dev/null +++ "b/ShinHeeEul/202502/04 BOJ P4 \354\210\230\354\227\264\352\263\274 \354\277\274\353\246\254 21.md" @@ -0,0 +1,114 @@ +```java +import java.util.*; +import java.io.*; + +public class Main { + + static long[] segments; + static long[] lazy; + static int size; + static int N; + + public static void main(String[] args) throws Exception { + N = read(); + + size = 1; + while(size < N) size <<= 1; + + segments = new long[(size << 1) + 1]; + lazy = new long[(size << 1) + 1]; + + for(int i = size + 1; i < (size + N + 1); i++) { + segments[i] = read(); + } + + int segmentSize = size << 1; + + while(segmentSize > 1) { + segments[segmentSize >> 1] = segments[segmentSize] + segments[segmentSize - 1]; + segmentSize -= 2; + } + + int M = read(); + StringBuilder sb = new StringBuilder(); + while(M --> 0) { + int a = read(); + if(a == 1) { + int i = read(); + int j = read(); + int k = read(); + updateLazy(i, j, 2, 1, size, k); + } else { + int x = read(); + sb.append(query(x,x,2,1,size)).append("\n"); + } + } + System.out.println(sb); + } + + public static void update(int node, int start, int end) { + // 현재 값 노드에 더하고? + segments[node] += lazy[node] * (int) (end - start + 1); + + // 밑으로 전파 시키고 + if(node > size) { + lazy[node] = 0; + return; + } + + int index = node << 1; + lazy[index] += lazy[node]; + lazy[index-1] += lazy[node]; + + lazy[node] = 0; + } + + public static void updateLazy(int left, int right, int node, int start, int end, int val) { + if(end < left || start > right) return; + + if(left <= start && end <= right) { + lazy[node] += val; + update(node, start, end); + return; + } + + int mid = (start + end) >> 1; + + updateLazy(left, right, (node << 1) - 1, start, mid, val); + updateLazy(left, right, node << 1, mid + 1, end , val); + + } + + public static long query(int left, int right, int node, int start, int end) { + + if(lazy[node] != 0) { + update(node, start, end); + } + + if(end < left || start > right) return 0L; + + if(left <= start && end <= right) { + return segments[node]; + } + + int mid = (start + end) >> 1; + return query(left, right, (node << 1) - 1, start, mid) + query(left, right, (node << 1), mid + 1, end); + } + + private static int read() throws Exception { + int d, o; + boolean negative = false; + d = System.in.read(); + + if (d == '-') { + negative = true; + d = System.in.read(); + } + o = d & 15; + while ((d = System.in.read()) > 32) + o = (o << 3) + (o << 1) + (d & 15); + + return negative? -o:o; + } +} +```