Skip to content

Commit 793288a

Browse files
authored
[20250411] BOJ / P2 / 하늘에서 떨어지는 1, 2, ..., R-L+1개의 별 / 신희을
1 parent 81e32e1 commit 793288a

File tree

1 file changed

+150
-0
lines changed

1 file changed

+150
-0
lines changed
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
```java
2+
import java.util.*;
3+
4+
public class Main {
5+
6+
static long[] segments;
7+
static long[] lazy;
8+
static int[] repl;
9+
static long[] sum;
10+
static int N;
11+
static int size = 1;
12+
public static void main(String[] args) throws Exception {
13+
N = read();
14+
15+
StringBuilder sb = new StringBuilder();
16+
17+
while(size < N) {
18+
size <<= 1;
19+
}
20+
21+
sum = new long[100001];
22+
23+
for(int i = 1; i < 100001; i++) sum[i] += sum[i-1] + i;
24+
25+
26+
segments = new long[(size << 1) + 1];
27+
lazy = new long[(size << 1) + 1];
28+
repl = new int[(size << 1) + 1];
29+
30+
for(int i = size + 1; i < size + N + 1; i++) {
31+
segments[i] = read();
32+
}
33+
34+
int segmentSize = size << 1;
35+
36+
while(segmentSize > 1) {
37+
segments[(segmentSize >> 1)] = segments[segmentSize] + segments[segmentSize - 1];
38+
segmentSize -= 2;
39+
}
40+
41+
// for(int i = 0; i < segments.length; i++) {
42+
// System.out.print(segments[i] + " ");
43+
// }
44+
45+
int M = read();
46+
47+
while(M-->0) {
48+
int a = read();
49+
50+
if(a == 1) {
51+
int l = read();
52+
int r = read();
53+
update(l, r, 2, 1, size);
54+
55+
} else {
56+
int x = read();
57+
sb.append(query(x,x,2,1,size)).append("\n");
58+
}
59+
}
60+
61+
System.out.println(sb);
62+
63+
}
64+
65+
public static void updateLazy(int node, int num) {
66+
67+
68+
long val = lazy[node];
69+
long rep = repl[node];
70+
71+
72+
segments[node] += val;
73+
lazy[node] = 0;
74+
repl[node] = 0;
75+
if(node > size) return;
76+
77+
//전파
78+
long a = (val - rep * (num * num)) >> 1;
79+
80+
lazy[(node << 1) - 1] += a;
81+
repl[(node << 1) - 1] += rep;
82+
lazy[(node << 1)] += (val - a);
83+
repl[(node << 1)] += rep;
84+
85+
}
86+
87+
public static void update(int left, int right, int node, int start, int end) {
88+
89+
if(left > end || right < start) return;
90+
91+
if(left <= start && end <= right) {
92+
// 1 - 8
93+
// 시작값 : start - left + 1
94+
// 끝값 : start - left + 1 + (end - start + 1)
95+
int startVal = start - left + 1;
96+
int num = (end - start + 1);
97+
int endVal = startVal + num;
98+
99+
lazy[node] += sum[endVal - 1] - sum[startVal - 1];
100+
repl[node] += 1;
101+
updateLazy(node, num >> 1);
102+
return;
103+
}
104+
105+
int mid = (start + end) >> 1;
106+
update(left, right, (node << 1) - 1, start, mid);
107+
update(left, right, node << 1, mid + 1, end);
108+
}
109+
110+
public static long query(int left, int right, int node, int start, int end) {
111+
112+
if(lazy[node] != 0) updateLazy(node, (end - start + 1) >> 1);
113+
114+
115+
if(left > end || right < start) return 0L;
116+
117+
if(left <= start && end <= right) {
118+
return segments[node];
119+
}
120+
121+
int mid = (start + end) >> 1;
122+
return query(left, right, (node << 1) - 1, start, mid) + query(left, right, (node << 1), mid + 1, end);
123+
}
124+
125+
126+
127+
private static int read() throws Exception {
128+
int c;
129+
int n = 0;
130+
boolean negative = false;
131+
132+
while ((c = System.in.read()) <= 32) {
133+
if (c == -1) return -1;
134+
}
135+
136+
if (c == '-') {
137+
negative = true;
138+
c = System.in.read();
139+
}
140+
141+
do {
142+
n = n * 10 + (c - '0');
143+
c = System.in.read();
144+
} while (c > 32);
145+
146+
return negative ? -n : n;
147+
}
148+
}
149+
150+
```

0 commit comments

Comments
 (0)