Skip to content

Commit 0b023d7

Browse files
authored
[20250204] BOJ / P4 / 수열과 쿼리 21 / 신희을
1 parent 51fb5fd commit 0b023d7

File tree

1 file changed

+114
-0
lines changed

1 file changed

+114
-0
lines changed
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
```java
2+
import java.util.*;
3+
import java.io.*;
4+
5+
public class Main {
6+
7+
static long[] segments;
8+
static long[] lazy;
9+
static int size;
10+
static int N;
11+
12+
public static void main(String[] args) throws Exception {
13+
N = read();
14+
15+
size = 1;
16+
while(size < N) size <<= 1;
17+
18+
segments = new long[(size << 1) + 1];
19+
lazy = new long[(size << 1) + 1];
20+
21+
for(int i = size + 1; i < (size + N + 1); i++) {
22+
segments[i] = read();
23+
}
24+
25+
int segmentSize = size << 1;
26+
27+
while(segmentSize > 1) {
28+
segments[segmentSize >> 1] = segments[segmentSize] + segments[segmentSize - 1];
29+
segmentSize -= 2;
30+
}
31+
32+
int M = read();
33+
StringBuilder sb = new StringBuilder();
34+
while(M --> 0) {
35+
int a = read();
36+
if(a == 1) {
37+
int i = read();
38+
int j = read();
39+
int k = read();
40+
updateLazy(i, j, 2, 1, size, k);
41+
} else {
42+
int x = read();
43+
sb.append(query(x,x,2,1,size)).append("\n");
44+
}
45+
}
46+
System.out.println(sb);
47+
}
48+
49+
public static void update(int node, int start, int end) {
50+
// 현재 값 노드에 더하고?
51+
segments[node] += lazy[node] * (int) (end - start + 1);
52+
53+
// 밑으로 전파 시키고
54+
if(node > size) {
55+
lazy[node] = 0;
56+
return;
57+
}
58+
59+
int index = node << 1;
60+
lazy[index] += lazy[node];
61+
lazy[index-1] += lazy[node];
62+
63+
lazy[node] = 0;
64+
}
65+
66+
public static void updateLazy(int left, int right, int node, int start, int end, int val) {
67+
if(end < left || start > right) return;
68+
69+
if(left <= start && end <= right) {
70+
lazy[node] += val;
71+
update(node, start, end);
72+
return;
73+
}
74+
75+
int mid = (start + end) >> 1;
76+
77+
updateLazy(left, right, (node << 1) - 1, start, mid, val);
78+
updateLazy(left, right, node << 1, mid + 1, end , val);
79+
80+
}
81+
82+
public static long query(int left, int right, int node, int start, int end) {
83+
84+
if(lazy[node] != 0) {
85+
update(node, start, end);
86+
}
87+
88+
if(end < left || start > right) return 0L;
89+
90+
if(left <= start && end <= right) {
91+
return segments[node];
92+
}
93+
94+
int mid = (start + end) >> 1;
95+
return query(left, right, (node << 1) - 1, start, mid) + query(left, right, (node << 1), mid + 1, end);
96+
}
97+
98+
private static int read() throws Exception {
99+
int d, o;
100+
boolean negative = false;
101+
d = System.in.read();
102+
103+
if (d == '-') {
104+
negative = true;
105+
d = System.in.read();
106+
}
107+
o = d & 15;
108+
while ((d = System.in.read()) > 32)
109+
o = (o << 3) + (o << 1) + (d & 15);
110+
111+
return negative? -o:o;
112+
}
113+
}
114+
```

0 commit comments

Comments
 (0)