Skip to content

Commit a87e77a

Browse files
authored
[20250211] BOJ / 플레3 / XOR / 신희을
1 parent d68362d commit a87e77a

File tree

1 file changed

+132
-0
lines changed

1 file changed

+132
-0
lines changed
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
```java
2+
import java.util.*;
3+
4+
import javax.xml.parsers.*;
5+
6+
import org.xml.sax.helpers.DefaultHandler;
7+
8+
import java.io.*;
9+
10+
public class Main {
11+
12+
static int[] segments;
13+
static int[] lazy;
14+
static int N;
15+
static int size;
16+
17+
public static void main(String[] args) throws Exception {
18+
19+
20+
int N = read();
21+
22+
size = 1;
23+
while(size < N) {
24+
size <<= 1;
25+
}
26+
27+
segments = new int[(size << 1) + 1];
28+
lazy = new int[(size << 1) + 1];
29+
for(int i = size + 1; i < size + N + 1; i++) {
30+
segments[i] = read();
31+
}
32+
33+
34+
int segmentSize = (size << 1);
35+
36+
StringBuilder sb = new StringBuilder();
37+
38+
while(segmentSize > 1) {
39+
segments[segmentSize >> 1] = segments[segmentSize] ^ segments[segmentSize-1];
40+
segmentSize-=2;
41+
}
42+
43+
44+
int M = read();
45+
46+
for(int i = 0; i < M; i++) {
47+
int a = read();
48+
int b = read() + 1;
49+
int c = read() + 1;
50+
51+
// 업데이트
52+
if(a == 1) {
53+
int d = read();
54+
update(b, c, 2, 1, size, d);
55+
56+
57+
}
58+
// 출력
59+
else {
60+
61+
sb.append(query(b, c, 2, 1, size)).append("\n");
62+
}
63+
}
64+
65+
System.out.println(sb);
66+
}
67+
68+
69+
public static void updateLazy(int node) {
70+
71+
if(node > size) {
72+
segments[node] ^= lazy[node];
73+
lazy[node] = 0;
74+
return;
75+
}
76+
77+
lazy[(node << 1) - 1] ^= lazy[node];
78+
lazy[(node << 1)] ^= lazy[node];
79+
lazy[node] = 0;
80+
81+
}
82+
83+
public static boolean update(int left, int right, int node ,int start, int end, int val) {
84+
85+
86+
if(end < left || right < start) return false;
87+
88+
if(left <= start && end <= right) {
89+
lazy[node] ^= val;
90+
updateLazy(node);
91+
return (end - start + 1) % 2 != 0;
92+
}
93+
94+
int mid = (start + end) >> 1;
95+
boolean b = update(left, right, (node << 1) - 1, start, mid, val) ^ update(left, right, (node << 1), mid + 1, end, val);
96+
if(b) segments[node] ^= val;
97+
98+
return b;
99+
}
100+
101+
public static int query(int left, int right, int node, int start, int end) {
102+
103+
if(lazy[node] != 0) updateLazy(node);
104+
105+
if(end < left || right < start) return 0;
106+
107+
if(left <= start && end <= right) {
108+
return segments[node];
109+
}
110+
111+
int mid = (start + end) >> 1;
112+
return query(left, right, (node << 1) - 1, start, mid) ^ query(left, right, (node << 1), mid + 1, end);
113+
}
114+
115+
private static int read() throws Exception {
116+
int d, o;
117+
boolean negative = false;
118+
d = System.in.read();
119+
if (d == 45) {
120+
negative = true;
121+
d = System.in.read();
122+
}
123+
124+
o = d & 15;
125+
while ((d = System.in.read()) > 32)
126+
o = (o << 3) + (o << 1) + (d & 15);
127+
128+
return negative ? -o : o;
129+
}
130+
131+
}
132+
```

0 commit comments

Comments
 (0)