Skip to content

Commit cd4cb0e

Browse files
authored
Merge pull request #590 from AlgorithmWithGod/0224LJH
[20250801] BOJ / P4 / XOR / 이종환
2 parents 163fd0c + 6c7910c commit cd4cb0e

File tree

1 file changed

+140
-0
lines changed

1 file changed

+140
-0
lines changed

0224LJH/202508/1 BOJ XOR.md

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
```java
2+
import java.io.BufferedReader;
3+
import java.io.IOException;
4+
import java.io.InputStreamReader;
5+
import java.util.StringTokenizer;
6+
7+
8+
public class Main {
9+
10+
static final int UPDATE = 1;
11+
static final int QUERY = 2;
12+
static int size, changeCnt, sumCnt,queryCnt;
13+
static long[] input;
14+
static StringBuilder sb = new StringBuilder();
15+
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
16+
17+
static class SegmentTree{
18+
private long[] lazy; //레이지 프로파게이션
19+
public long[] tree;
20+
private int size; // 원본 배열의 크기
21+
22+
public SegmentTree(long[] arr){
23+
size = arr.length;
24+
this.lazy = new long[size*4];
25+
this.tree = new long[size*4];
26+
build(arr,1,0,size-1);
27+
}
28+
29+
private void build(long[] arr, int node, int startIdx, int endIdx){
30+
if(startIdx == endIdx){
31+
tree[node] = arr[startIdx];
32+
return;
33+
}
34+
35+
int mid = (startIdx + endIdx)/2;
36+
build(arr,node*2,startIdx,mid);
37+
build(arr,node*2+1,mid+1,endIdx);
38+
tree[node] = tree[node*2] + tree[node*2+1];
39+
}
40+
41+
public void updateRange(int startIdx , int endIdx, long k ){
42+
updateRange(1, 0, size-1, startIdx, endIdx, k);
43+
}
44+
45+
private void updateRange(int node,int left,int right, int startIdx , int endIdx, long k){
46+
updateLazy(node, left, right);
47+
48+
if ( left > endIdx || right < startIdx) return; //현 구간과 업데이트 구간이 아예 안겹칩
49+
50+
if (left >= startIdx && right <= endIdx){ // 완전히 포함되는 경우
51+
// 업데이트 적용 후, 자식에게는 레이지 전파
52+
lazy[node] ^= k;
53+
54+
return;
55+
}
56+
57+
int mid = (left+right)/2;
58+
59+
updateRange(node*2, left, mid, startIdx, endIdx, k);
60+
updateRange(node*2+1, mid+1, right, startIdx, endIdx, k);
61+
62+
updateLazy(node*2, left, mid);
63+
updateLazy(node*2+1, mid+1,right);
64+
}
65+
66+
private void updateLazy(int node, int left, int right){
67+
if (lazy[node] == 0) return;
68+
long k = lazy[node];
69+
tree[node] ^= k;
70+
if (left != right){
71+
lazy[node*2] ^= k;
72+
lazy[node*2+1] ^= k;
73+
}
74+
lazy[node] = 0;
75+
}
76+
77+
public long query(int startIdx, int endIdx){
78+
return query(1,0, size-1, startIdx, endIdx);
79+
}
80+
81+
private long query(int node , int left, int right, int startIdx , int endIdx){
82+
updateLazy(node, left, right);
83+
if ( left > endIdx || right < startIdx) return 0;
84+
if (left >= startIdx && right <= endIdx) return tree[node];
85+
86+
int mid = (left+right)/2;
87+
return query(node*2, left, mid, startIdx, endIdx) + query(node*2+1, mid+1, right, startIdx, endIdx);
88+
}
89+
}
90+
91+
92+
93+
public static void main(String[] args) throws IOException {
94+
init();
95+
process();
96+
print();
97+
}
98+
99+
private static void init() throws IOException {
100+
size = Integer.parseInt(br.readLine());
101+
input = new long[size];
102+
103+
104+
StringTokenizer st = new StringTokenizer(br.readLine());
105+
for (int i = 0; i < size; i++) {
106+
input[i] = Long.parseLong(st.nextToken());
107+
}
108+
109+
queryCnt = Integer.parseInt(br.readLine());
110+
111+
}
112+
113+
private static void process() throws IOException {
114+
115+
SegmentTree tree = new SegmentTree(input);
116+
117+
for (int i = 0; i < queryCnt + sumCnt; i++) {
118+
StringTokenizer st = new StringTokenizer(br.readLine());
119+
int order = Integer.parseInt(st.nextToken());
120+
int start = Integer.parseInt(st.nextToken());
121+
122+
123+
if (order == UPDATE) {
124+
int end = Integer.parseInt(st.nextToken());
125+
long plus = Long.parseLong(st.nextToken());
126+
tree.updateRange(start, end, plus);
127+
} else sb.append(tree.query(start, start)).append("\n");
128+
129+
}
130+
131+
}
132+
133+
134+
private static void print() {
135+
System.out.println(sb.toString());
136+
137+
}
138+
}
139+
140+
```

0 commit comments

Comments
 (0)